我们使用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。
答案 0 :(得分:3)
通常使用的DLL有4种基本设计方法:
听起来你有最后2个中的一个,但是根据你的问题你无法判断你所指的原型。
对于应用程序层,您通常会在composition root中组合应用程序内部的组件,尽可能接近主要可执行文件应用程序的入口点。 / p>
对于插件,它通常会有自己的内部组合根,它由插入的应用程序的某个方法或事件触发(基于该应用程序的组合根)。 DI容器中的 modules 有时会促进这一点。
库通常不具有任何内部组合,但会提供API(有时实现为流畅的builder),使客户端应用程序可以轻松地将各个部分组合在一起。有关如何执行该操作的一些想法,请参阅this post。
框架需要有一个或多个显式扩展点才能将应用程序集成到其中。想想MVC控制器的工作原理。有一个内部扫描实现,默认情况下可以实例化任何实现某个接口的对象。如果默认构造函数不可用(在MVC中,即abstract factory),还可以使用IControllerFactory来注入依赖项。有关如何建立DI友好框架的更多信息,请参阅this post。