从容器中获取对象和依赖注入的示例?

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)

Ste*_*ins 5

对我来说,这是一个控制反转和依赖倒置Princial的例子,因为Worker类正在从容器中请求ITool,而不是自己实例化它,但它并不是依赖注入的一个例子,因为依赖不是"从外部注入,从内部"请求".

这些术语可能非常混乱,并且经常互换使用(不正确),但只要您的代码解耦,因此您不依赖于具体实现或"模块化"中的"新建"事物,那么您就会获益核心优势.

就个人而言,即使我没有使用总体容器,我很少进行构造函数注入 - 我发现它是单元测试等最简单的方法.


ant*_*ony 5

你在这里有"服务位置"而不是"依赖注入",虽然两者都是"控制反转"的例子.

您将要阅读" 控制容器的反转和依赖注入模式 ",并密切关注本节.

不要担心,如果你感到不知所措,一次性接受这一切并不是很重要.有关现实世界依赖注入工具的更加结构化的介绍,我强烈推荐Ninject用户指南.