放置例如我可以访问的静态类中的autofac/ninject来自不同的程序集/项目?IoC:使用静态IoC容器进行依赖注入
static class MyContainer static {} IoCContainer ContainerOfCurrentRuntimeContext; }
如果我使用这个,我可以在不同的项目中使用相同的IoC上下文。
放置例如我可以访问的静态类中的autofac/ninject来自不同的程序集/项目?IoC:使用静态IoC容器进行依赖注入
static class MyContainer static {} IoCContainer ContainerOfCurrentRuntimeContext; }
如果我使用这个,我可以在不同的项目中使用相同的IoC上下文。
没有,这种做法将增加两个新问题:单和服务定位模式(既算作反模式)。因此,您的代码将与新的依赖关系耦合在一起:您的DI容器。
通常你能够克服使用服务定位器的限制,但是这不值得做,因为它更简单介绍组成根为DI。
顺便说一句,你可以有一个配置,并在你所有的不同项目中使用它。
好的,谢谢。单配置点:但在这种情况下,我不会得到相同的实例,不是吗? – user437899 2012-07-12 06:33:48
是的,_one_依赖注入_kernel_(根据nIninject)可以多次解析相同的依赖对象。这是通过声明特定的_scope_(根据nIninject)来完成的。您可以指定每次在线程或http请求的作用域中请求DI时,DI将逐字地注入相同的依赖实例。你也可以定义你自己的范围。 – Akim 2012-07-12 15:42:53
但是,如果你这样做,这将意味着你的代码的其他部分将调用它来获取实例,这与控制手段的反转是完全相反的。类不应该负责获取它们的依赖关系。这些依赖关系应该作为构造函数参数(构造函数注入)或属性(属性注入)传递。你的DI容器应该只在应用程序的一个地方可见,通常是最外层的地方。 – 2012-07-11 15:57:32
@DarinDimitrov:不,它不是控制倒置的对立面。控制的倒置只是说我们应该与抽象对话,而不应该自己创建对象。然而,它与依赖注入相反。 – Steven 2012-07-11 17:32:55
请在Stackoverflow和Google搜索“服务定位器反模式”。使用全局可访问的容器称为“服务定位器模式”,它被认为是反模式。 – Steven 2012-07-11 17:34:29