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

时间:2015-02-27 14:30:26

标签: c# dependency-injection ninject

我们使用ninject作为我们的DI解决方案。如何使用自己的内部IOC创建自我维持的类库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。

1 个答案:

答案 0 :(得分:3)

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

  1. 应用层。
  2. 插件。
  3. 图书馆。
  4. 框架。
  5. 听起来你有最后2个中的一个,但是根据你的问题你无法判断你所指的原型。

    对于应用程序层,您通常会在composition root中组合应用程序内部的组件,尽可能接近主要可执行文件应用程序的入口点。 / p>

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

    库通常不具有任何内部组合,但会提供API(有时实现为流畅的builder),使客户端应用程序可以轻松地将各个部分组合在一起。有关如何执行该操作的一些想法,请参阅this post

    框架需要有一个或多个显式扩展点才能将应用程序集成到其中。想想MVC控制器的工作原理。有一个内部扫描实现,默认情况下可以实例化任何实现某个接口的对象。如果默认构造函数不可用(在MVC中,即abstract factory),还可以使用IControllerFactory来注入依赖项。有关如何建立DI友好框架的更多信息,请参阅this post