如何在多项目解决方案中使用SimpleInjector而不创建循环引用

quj*_*jck 8 c# dependency-injection inversion-of-control simple-injector

我正在启动一个多项目解决方案,它将有多个入口点,例如Windows服务,ASP.NET网站,WebApi控制器等.我已经选择了SimpleInjector,因为它非常快,我不需要任何高级特征.

我的理解是SimpleInjector应该在启动时集中配置.从以下基本示例项目集开始

  • NS.Controllers
  • NS.Core.Data
  • NS.Core.Data.Model
  • NS.Web
  • NS.WindowsService(假设这不会一直运行)

有多个入口点,SimpleInjector的引导应该在哪里进行,可以/应该集中处理(在这种情况下,配置过程需要引用所有项目才能设置所有解决方案类)?

我是否应该有一个全局实例(例如NS.Global.Container),它不引用任何其他项目,并且每个入口点都负责在启动时添加自己的实例要求(优雅地处理重复注册,如NS.Core.Model)?

我是否应该使用ResolveUnregisteredType事件来处理请求的注册?

我只是缺乏一些小学生的知识吗?

更新:

Steven在下面的评论中提供的链接给出了这个问题的全面答案.

何处在多层应用程序中定位Ninject模块

如何在mvc站点的类项目部分初始化Ninject

jav*_*iry 8

为什么不使用IPackage界面?您可以在每个模块中创建包,然后在每个入口点调用container.RegisterPackages();.例如,所有配置NS.Core.Data都将位于NS.Core.Data.dll,依此类推.然后,它会在两个可用的NS.WebNS.WindowsService.在NS.Web刚刚配置被指定给它,然后调用类型container.RegisterPackages();等.您的NS.Core.Data包装可能如下所示:

public class CoreDataPackage : IPackage {
    public void RegisterServices(Container container) {
        container.Register<ISomeService,SomeImplementation>();
        // etc...
    }
}
Run Code Online (Sandbox Code Playgroud)


Maa*_*ten 5

每个入口点应具有自己的自举容器。

NS.Web应该有一个,因为那是一个网站(我在这里假设)。NS.WindowsService应该具有一个,因为它是.exe(服务)。

其他项目看起来像类库,因此它们没有自举容器。

从理论上讲,是的,您可以在每个类库中定义一个部分引导容器,然后将其用于主引导容器(在Web /服务项目中),以简化工作。然后,在部分容器中,对该类库的组件进行引导。