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

Gil*_*lla 2 c# dependency-injection

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

编辑:我在这里读到我的问题的原因 ,StreamReader可以看作是IoC/DI的例子......这与过载有什么不同?或者它只是DI而不是完全DI?

Jon*_*eet 14

他们是完全不同的概念.

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

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

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

通常我会在服务方面考虑DI - 例如身份验证者,或者可能是链中的下一个服务(例如,请求经历多个阶段).


Gre*_*g D 5

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

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

public Foo MakeFoo(int bar) { }
public Foo MakeFoo(double bar) { }
public Foo MakeFoo(Decimal bar) { }
Run Code Online (Sandbox Code Playgroud)

依赖注入是一种独立于语言的技术,您可以删除在对象中生成的隐藏依赖项,而不是将它们传递给对象.例如:

改变这个:

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

进入这个:

// 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;
    }
}
Run Code Online (Sandbox Code Playgroud)