尽管DI在界面驱动中......我还不清楚这与基本的超载概念究竟有什么区别。任何C#示例都会有所帮助。重载和依赖注入有什么区别?
编辑:我读到这里the reason for my question 是StreamReader
可以看作是例子的IoC/DI的...是如何从这个重载完全不同?或者它只是DI的外表而不完全是DI?
尽管DI在界面驱动中......我还不清楚这与基本的超载概念究竟有什么区别。任何C#示例都会有所帮助。重载和依赖注入有什么区别?
编辑:我读到这里the reason for my question 是StreamReader
可以看作是例子的IoC/DI的...是如何从这个重载完全不同?或者它只是DI的外表而不完全是DI?
他们是完全不同的概念。
重载:提供具有相同名称(或构造函数)的倍数方法,该方法根据参数的数量和/或类型而不同。依赖注入:为组件提供它们需要使用的所有服务(例如,验证器,数据库连接等),而不是让它们自己构造这些依赖关系。 DI鼓励在接口和实现之间进行干净的分离,并且使得单元测试更容易(因为您可以模拟/伪造依赖关系)。
编辑:我不认为我通常会用StreamReader
依赖注入的一个很好的例子 - 尤其是它可以创建自己为你流的,如果你只指定一个文件名。可以肯定的是,带有Stream
参数的超载有效地允许注入流依赖,但这不是我通常认为的DI。构造函数当然是重载的一个例子 - 但是这两者真的没有关系。
通常我会想到服务 - 类似于验证器,或者可能是链中的下一个服务(例如请求经历多个阶段)。
谢谢乔恩!但是,你能看到我的编辑...并且对此有所了解吗? – GilliVilla 2010-07-29 15:36:42
Gillivilla:我已经在下面更新了我的答案。 – 2010-07-29 15:42:05
重载和依赖注入是完全独立的想法,除了在执行依赖注入时可以利用重载之外,没有什么共同之处。
重载是语言的一项功能,其中(例如)两种方法可以共享相同的名称,但具有不同的参数列表。例如:
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;
}
}
这很难回答这个问题,因为这两个概念真的有nothng共同点。
超载:几种方法(做potenially完全不同的东西)共享相同的名称(由不同的参数列表通常differeniated)
依赖注入:由一个方法中使用的(或由一类物体)不是在方法中创建的,而是在外部创建并传递(注入)到其中。
UPDATE(基于OP的UPDATE):
StreamReader的是DI的例子,因为它实际上并没有创造它读取蒸汽 - 流在别处创建并传递到它的构造函数。这允许它在任何形式的流上工作(磁盘文件,字符串,网络套接字等)
您需要说明您在说什么。因为DI和重载是完全不同的概念。 – Nix 2010-07-29 15:15:42
他们是怎么看起来和你类似的?也许这将帮助我们澄清任何误解。 – apollodude217 2010-07-29 15:20:30
我澄清了我的疑惑。 – GilliVilla 2010-07-29 15:36:15