依赖注入:如何通过注射容器?

Ale*_*lex 7 .net c# dependency-injection inversion-of-control

(这个问题不依赖于特定的IoC框架,因此我的示例中的接口和类型是元类型.只需用适合您喜欢的IoC框架的类型替换它们.)

在我的主要方法中,我通常设置我的容器做这样的事情:

static void Main()
{
    IInjector in = new Injector();
    in.Register<ISomeType>().For<SomeType>();
    in.Register<IOtherType().For<OtherType>();
    ...

    // Run actual application
    App app = in.Resolve<App>();
    app.Run();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,你是如何得到注射器的?我通常只是自己注册了注射器并注入了自己注射的类型,但我不确定这是否是正确的"模式".

mat*_*t b 14

你不应该绕过容器.

相反,您的入口点/ main方法会向容器询问它需要启动的对象 - 例如您的App对象/ bean.然后容器返回连接到的完整对象图App,允许您运行app.Run(),满足所有依赖项.

这是一个有点为对象的反模式是知道的容器,或者为每个对象是要求容器为它的依赖-如果你这样做,那么你有没有反转的控制,你有什么是不依赖注入-你仍然有对象要求他们需要什么,而不是给他们需要的东西.

  • @Alex:在这种情况下,您可以使用我在其他帖子中提到的"提供商"(专业工厂).注入Provider和注入整个注入器之间的区别在于,这极大地限制了间接的"秘密"依赖关系.IOW,它不会将Injector降级为服务定位器. (2认同)
  • @Alex:提供者可以自由地构造属于该模块的某种对象,包括其所有依赖项(但它们不应该执行程序执行逻辑).它们是构造代码的一部分,因此它们可以保持注射器周围(或只是它们所需的部分).关于依赖注入最重要的事情肯定是将构造代码与执行代码分开.提供者提供了一种在执行部分中需要一些构造的方法(因为它不应该单独执行). (2认同)
  • 一些容器(Autofac,Funq,最新的Unity,其他)允许您使用Func <T>作为提供程序,因此要创建Button的实例,请依赖Func <Button>,容器完成剩下的工作.有关更多详细信息,请参见http://nblumhardt.com/2010/01/the-relationship-zoo/. (2认同)