如何使用 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 基本设计方法:
- 一个应用层。
- 一个插件。
- 图书馆。
- 一个框架。
听起来你有最后两个中的一个,但根据你的问题无法判断你指的是哪个原型。
对于应用程序层,您通常会在应用程序内部编写组件,在 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 友好框架的更多信息。
我们使用 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 基本设计方法:
- 一个应用层。
- 一个插件。
- 图书馆。
- 一个框架。
听起来你有最后两个中的一个,但根据你的问题无法判断你指的是哪个原型。
对于应用程序层,您通常会在应用程序内部编写组件,在 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 友好框架的更多信息。