关于IoC的有趣之处在于,写入风格的对象通常与这些细节分离。
让我们使用实用工具类为例:
public class HttpUtils
{
public static void DoStuff(int someValue)
{
// ...
}
}
在非国际奥委会为重点的应用程序,你可以直接使用该方法:
public class Foo
{
public int Value { get; set; }
public void DoStuff()
{
HttpUtils.DoStuff(Value);
}
}
然而,夫妇的定义DoStuff
直接执行。国际奥委会致力于离婚的种种细节,所以不是我们定义自身的操作:
public interface IDoesStuff
{
void DoStuff(int someValue);
}
然后,我们离开房间Foo
为实现改变:
public class Foo
{
private readonly IDoesStuff _doesStuff;
public Foo(IDoesStuff doesStuff)
{
_doesStuff = doesStuff;
}
public int Value { get; set; }
public void DoStuff()
{
_doesStuff.DoStuff(Value);
}
}
这样可以使Foo
从HttpUtils
。 DoStuff
这个概念的实现者现在是一个配置细节,而不是一个固有的依赖关系(就像静态方法一样)。
请注意,Foo
不知道它的IDoesStuff
是否为单例。该生存期是也是的配置细节,而不是Foo
的固有细节。
总而言之,IoC和static
一般都是不一致的,因为IoC促进变化,根据定义,static
可以阻止它。在你的构造函数中声明你的依赖关系,你会发现你几乎从来没有使用过static
的功能。
感谢Bryan - 这是否意味着每次都可能会有更多的IOC构造事物(例如记录器)的开销?同样对于utils类型类,我想知道这会不会在重构助手类中的辅助函数时使得重构更难? (我自己使用ReSharper) - 谢谢 – Greg 2010-03-26 21:17:41
大多数IoC容器允许某种范围的范围。通过这个,我的意思是说明你的对象是每次(工厂)创建的,每个上下文(工作单元)创建一次,还是每个应用程序(单例)一次。这意味着您可以注册记录器,使其仅创建一次。 – 2010-03-26 21:28:05
最终你想消除公用事业类。每个类中的每个方法都与上面的“HttpUtils.DoStuff”方法具有相同的耦合问题。出于这个原因,你不想要求任何*代码直接依赖于'static'成员。相反,将'HttpUtils.DoStuff'的主体放在'IDoesStuff'后面,并从'HttpUtils'完全删除该方法。现在,任何可能调用静态方法的类都可以在其构造函数中接受'IDoesStuff'。维奥拉:不再需要公用事业类! – 2010-03-26 21:37:51