在类库中创建Ninject内核

bak*_*san 8 design-patterns ninject ioc-container

我有一个类,它具有我与Ninject连接的依赖项.

public interface IFoo {}

public class MyObject {
    [Inject]
    IFoo myfoo;
}
Run Code Online (Sandbox Code Playgroud)

在真正的实现中,我正在使用属性注入,但为了快速说明,我将注入该字段.据我所知,我需要使用,而不是新建MyObject实例,以便正确地注入依赖项

kernel.Get<MyObject>()
Run Code Online (Sandbox Code Playgroud)

然而,我磕磕绊绊的是MyObject只会在类库的上下文中使用.目的是让最终应用程序创建自己的模块并将其传递给内核实例以进行水合.鉴于此,通常最实用的方法是将Ninject内核的通用实例呈现给我的类库,以便MyObject(和其他类似情况)的实例可以被水合?

我的第一个倾向是某种工厂内部化单例内核 - 应用程序本身必须通过加载模块来进行水合/初始化.

所以在RandomService.cs中

var myKernel = NinjaFactory.Unleash();
var myobj = myKernel.Get<MyObject>();
myobj.foo();
Run Code Online (Sandbox Code Playgroud)

在我走这条路之前,我需要做一个完整性检查,以确保思路健全,或者没有其他一些我不知道的东西.我显然是IoC的新手,感觉我喜欢基础知识,但不一定是最好的现实世界使用方式.

Mar*_*ann 9

我不确定我是否理解你问题中的所有细节,但据我了解,你问的是如何将对Ninject的依赖外部化.

可以编写DI友好的库而无需引用任何特定的DI容器(Ninject或其他任何东西).这使得图书馆的消费者可以选择他或她喜欢的DI容器(或根本不使用容器).这种方法是更优选的,因为它提供了更大的自由度.

但是,您应该支持构造函数注入而不是Property Injection.虽然Property Injection看起来似乎很容易实现,但实际上很难做到正确.

构造函数注入的一大优势是您不需要在构造函数上放置任何属性,因为它在结构上已经包含了DI容器正确连接所需的所有信息.

  • 即使使用内部应用程序,我仍然会遵循相同的原则,因为它们可以更好地分离关注点,从而实现更清晰的代码.Property Injection存在许多潜在的问题,包括保护不变量(是依赖项null吗?),可能是热插拔注入的依赖项(可能不是你想要做的事情)和一般的更模糊的API. (2认同)
  • 哦,只是提前做好明确的事情:我认为Service Locator是一种反模式:http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx (2认同)