我有一个具有与Ninject连接的依赖关系的类。在类库中创建Ninject内核
public interface IFoo {}
public class MyObject {
[Inject]
IFoo myfoo;
}
在真正的实现中,我使用属性注入,但只是为了快速说明,我将注入该字段。按照我的理解,而不是为MyObject的newing情况下,为了获得依赖于正确地注入,我需要使用
kernel.Get<MyObject>()
但是我跌跌撞撞的事情是,为MyObject将只在使用类库的上下文。目的是让最终应用程序创建自己的模块并将其传递到内核实例中进行保湿。鉴于此,通常最实用的方法是将一个Ninject内核的通用实例展示给我的类库,以便MyObject(以及其他类似案例)的实例可以被水合?
我的第一个倾向是某种内部化单体内核的工厂 - 应用程序本身必须通过加载模块来进行水合/初始化。
所以在RandomService.cs
var myKernel = NinjaFactory.Unleash();
var myobj = myKernel.Get<MyObject>();
myobj.foo();
我走的太远了这条路,虽然之前,我需要做一个全面的检查,以确保思想是健全或不存在一些明显的其他我错过的东西。对于IoC来说,我显然是新手,并且觉得我非常喜欢基础知识,但不一定是现实世界中最好的方式。
幸运的是,这是一个内部(在公司的意义上)lib,所以我有一个被俘的观众 - 我的团队中的其他开发人员使用标准工具。现在,每个开发者可能有不同的绑定他们想要的,因此我原来的困惑。 回复:ctor vs道具注入,道具看起来似乎有很多我不得不写的东西,但是我担心随着时间的推移依赖列表不断增长,因此ctor调用。是否有其他缺点支持注射我应该注意? – bakasan 2010-02-11 08:50:19
即使使用内部应用程序,我仍然会遵循相同的原则,因为它们会导致更清晰的代码,更好地分离问题。注入属性有许多潜在的问题,包括保护不变量(是依赖项null?),可能会热插拔注入的依赖项(可能不是您想要执行的操作)以及一般更模糊的API。 – 2010-02-11 09:08:41
哦,只是为了预先考虑并明确表示:我认为服务定位器是一种反模式:http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx – 2010-02-11 09:10:18