繁体   English   中英

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

[英]What is the difference between Overloading and Dependency Injection?

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

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

他们是完全不同的概念。

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

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

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

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

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

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

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;
    }
}

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

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

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

更新(基于OP的更新):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM