重载和依赖注入有什么区别?

时间:2010-07-29 15:13:16

标签: c# dependency-injection

虽然DI在接口驱动中......我仍然不清楚这与基本重载概念的确切区别。任何C#示例都会有所帮助。

编辑:我在这里阅读the reason for my question StreamReader可以看作是IoC / DI的例子......这与重载有什么不同?或者它只是DI而不是完全DI?

3 个答案:

答案 0 :(得分:14)

他们是完全不同的概念。

重载:提供具有相同名称(或构造函数)的多重方法,这些方法因参数的数量和/或类型而不同。

依赖注入:为组件提供他们需要使用的所有服务(例如,身份验证器,数据库连接等),而不是让他们自己构建这些依赖项。 DI鼓励在接口和实现之间进行清晰的分离,并使单元测试更容易(因为您可以模拟/伪造依赖项)。

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

通常情况下,我会根据服务来考虑DI,例如验证者,或者可能是链中的下一个服务(例如,请求经过多个阶段)。

答案 1 :(得分:5)

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

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

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

依赖注入是一种与语言无关的技术,您可以删除在对象中生成的隐藏依赖项,而不是将它们传递给对象。 E.g:

改变这个:

// 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 :(得分:2)

很难回答这个问题,因为这两个概念确实没有共同之处。

  • 重载:几种方法(做完全不同的事情)共享相同的名称(通常由不同的参数列表区分)

  • 依赖注入:方法(或类)使用的对象不是在方法中创建的,而是在外部创建并传递(注入)到它中。

更新(基于OP的更新):

StreamReader是DI的一个例子,因为它实际上并没有创建它所读取的流 - 流在别处创建并传递给它的ctor。这允许它处理任何形式的流(磁盘文件,字符串,网络套接字等)