如何使用 ninject 处理可重用 dll 中特定于层的依赖注入?

How to handle layer specific Dependency Injection in a reusable dll with ninject?

我们使用 ninject 作为我们的 DI 解决方案。如何创建具有自己内部 IOC 的自我维持 class 库 dll。基本上我已经创建了一个做某事的服务,我想在 dll 中注册绑定并将它交给其他人。我不希望他们关心我的 dll 中的任何绑定。

在dll中:

public class FirstService : IFirstService 
{
    public FirstService(ISecondService secondService, IThirdService thirdService)
    {
        //Saves locally
    }
    //Does stuff with second and third services
}

最终用户做什么:

public class ThirdService : IThirdService 
{
    //Create the actual implementation of this
}

我想要的dll里面的东西:

private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IFirstService>.To<FirstService>();
        kernel.Bind<ISecondService>.To<SecondService>();
    }

我不认为我想在这里使用 IKernel,因为可能存在内存泄漏。

有 4 种常用的 DLL 基本设计方法:

  1. 一个应用层。
  2. 一个插件。
  3. 图书馆。
  4. 一个框架。

听起来你有最后两个中的一个,但根据你的问题无法判断你指的是哪个原型。

对于应用程序层,您通常会在应用程序内部编写组件,在 composition root 中,尽可能靠近 主可执行文件 的入口点尽可能申请。

对于插件,它通常有自己的内部组合根,由它插入的应用程序的某些方法或事件触发(基于该应用程序的组合根)。 DI 容器中的 模块 有时会促进这一点。

图书馆通常不会有任何内部组成,但会提供一个 API(有时作为一个流利的 builder) that makes it easy for the client application to compose the pieces together. See this post 实施,以获得关于如何做到这一点的一些想法。

一个框架需要有 1 个或多个显式扩展点供应用程序集成。想想 MVC 控制器是如何工作的。有一个内部扫描实现,默认情况下可以实例化任何实现某个接口的对象。还有一个 abstract factory that can be used to inject dependencies if the default constructor is not available (in MVC, that is IControllerFactory). See this post 有关如何制作 DI 友好框架的更多信息。