【问题标题】:How to use SimpleInjector in a multi project solution without creating circular references如何在多项目解决方案中使用 SimpleInjector 而不创建循环引用
【发布时间】:2012-11-27 13:41:29
【问题描述】:

我正在启动一个多项目解决方案,该解决方案将有多个入口点,例如 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.型号)?

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

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

更新:

Steven 在下面的 cmets 中提供的链接可以彻底回答这个问题。

Where to locate Ninject modules in a multi-tier application

How to initialize Ninject in a class project part of an mvc site

【问题讨论】:

  • 您可以集中引导容器,但我个人不会。更好地为每个入口点配置自己的容器。这并不是说像您的存储库这样的元素不会在一个地方完成。使用 Windsor 安装程序之类的东西可能会很方便。您的所有入口点使用在容器中注册的完全相同的项目似乎不太可能,即使它们现在是,将来也可能不会。

标签: c# dependency-injection inversion-of-control simple-injector


【解决方案1】:

为什么不使用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...
    }
}

【讨论】:

    【解决方案2】:

    每个入口点都应该有自己的引导容器。

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

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

    理论上,是的,您可以在每个类库中定义一个部分引导容器,然后您可以在主引导容器(在 Web/服务项目中)使用它,让生活更轻松。然后,在部分容器中,您将为该类库的组件进行引导。

    【讨论】:

    • Composition Root 是一个术语,通常用来指引导容器应该去哪里。
    猜你喜欢
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 2022-07-03
    相关资源
    最近更新 更多