sip*_*wiz 1 design-patterns dependency-injection
下面的示例是关于类的依赖注入Worker
吗?该Worker
班没有获得ITool
从属性setter或构造函数实例,而是被从容器中取出呢?
public MainClass {
static void Main(string[] args) {
ITool someTool = new Tool();
MyContainer.Register<ITool>(someTool);
}
}
public class MyContainer {
private WindsorContainer container;
public MyContainer() {
container = new WindsorContainer();
}
public static T Resolve<T>() {
return container.Resolve<T>();
}
public static void Register<T>(object instance) {
container.Kernel.AddComponentInstance(typeof(T).ToString(), typeof(T), instance);
}
}
public class Worker {
public DoSomeWork() {
ITool tool = MyContainer.Resolve<ITool>();
tool.DoTheWork();
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说,这是一个控制反转和依赖倒置Princial的例子,因为Worker类正在从容器中请求ITool,而不是自己实例化它,但它并不是依赖注入的一个例子,因为依赖不是"从外部注入,从内部"请求".
这些术语可能非常混乱,并且经常互换使用(不正确),但只要您的代码解耦,因此您不依赖于具体实现或"模块化"中的"新建"事物,那么您就会获益核心优势.
就个人而言,即使我没有使用总体容器,我也很少进行构造函数注入 - 我发现它是单元测试等最简单的方法.
你在这里有"服务位置"而不是"依赖注入",虽然两者都是"控制反转"的例子.
您将要阅读" 控制容器的反转和依赖注入模式 ",并密切关注本节.
不要担心,如果你感到不知所措,一次性接受这一切并不是很重要.有关现实世界依赖注入工具的更加结构化的介绍,我强烈推荐Ninject用户指南.