2010-07-29 67 views
2

尽管DI在界面驱动中......我还不清楚这与基本的超载概念究竟有什么区别。任何C#示例都会有所帮助。重载和依赖注入有什么区别?

编辑:我读到这里the reason for my questionStreamReader可以看作是例子的IoC/DI的...是如何从这个重载完全不同?或者它只是DI的外表而不完全是DI?

+1

您需要说明您在说什么。因为DI和重载是完全不同的概念。 – Nix 2010-07-29 15:15:42

+0

他们是怎么看起来和你类似的?也许这将帮助我们澄清任何误解。 – apollodude217 2010-07-29 15:20:30

+0

我澄清了我的疑惑。 – GilliVilla 2010-07-29 15:36:15

回答

14

他们是完全不同的概念。

重载:提供具有相同名称(或构造函数)的倍数方法,该方法根据参数的数量和/或类型而不同。依赖注入:为组件提供它们需要使用的所有服务(例如,验证器,数据库连接等),而不是让它们自己构造这些依赖关系。 DI鼓励在接口和实现之间进行干净的分离,并且使得单元测试更容易(因为您可以模拟/伪造依赖关系)。

编辑:我不认为我通常会用StreamReader依赖注入的一个很好的例子 - 尤其是它可以创建自己为你流的,如果你只指定一个文件名。可以肯定的是,带有Stream参数的超载有效地允许注入流依赖,但这不是我通常认为的DI。构造函数当然是重载的一个例子 - 但是这两者真的没有关系。

通常我会想到服务 - 类似于验证器,或者可能是链中的下一个服务(例如请求经历多个阶段)。

+0

谢谢乔恩!但是,你能看到我的编辑...并且对此有所了解吗? – GilliVilla 2010-07-29 15:36:42

+0

Gillivilla:我已经在下面更新了我的答案。 – 2010-07-29 15:42:05

5

重载和依赖注入是完全独立的想法,除了在执行依赖注入时可以利用重载之外,没有什么共同之处。

重载是语言的一项功能,其中(例如)两种方法可以共享相同的名称,但具有不同的参数列表。例如:

public Foo MakeFoo(int bar) { } 
public Foo MakeFoo(double bar) { } 
public Foo MakeFoo(Decimal bar) { } 

依赖注入是独立于语言的技术,你删除在对象内生成隐藏依赖性,而是将它们传递到对象。例如: -

转化这样的:

// Foo has an implicit dependency on Bar 
class Foo 
{ 
    private Bar myBar; 
    public Foo() 
    { 
     this.myBar = new Bar(); 
    } 
} 

到这一点:

// Now Foo's dependency on Bar is explicit b/c it's being injected in the .ctor 
class Foo 
{ 
    private Bar myBar; 
    public Foo(Bar aBar) 
    { 
     this.myBar = aBar; 
    } 
} 
2

这很难回答这个问题,因为这两个概念真的有nothng共同点。

  • 超载:几种方法(做potenially完全不同的东西)共享相同的名称(由不同的参数列表通常differeniated)

  • 依赖注入:由一个方法中使用的(或由一类物体)不是在方法中创建的,而是在外部创建并传递(注入)到其中。

UPDATE(基于OP的UPDATE):

StreamReader的是DI的例子,因为它实际上并没有创造它读取蒸汽 - 流在别处创建并传递到它的构造函数。这允许它在任何形式的流上工作(磁盘文件,字符串,网络套接字等)