Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在多项目解决方案中使用SimpleInjector而不创建循环引用_C#_Dependency Injection_Inversion Of Control_Simple Injector - Fatal编程技术网

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

C# 如何在多项目解决方案中使用SimpleInjector而不创建循环引用,c#,dependency-injection,inversion-of-control,simple-injector,C#,Dependency Injection,Inversion Of Control,Simple Injector,我正在启动一个多项目解决方案,该解决方案将有多个入口点,例如Windows服务、ASP.NET网站、WebApi控制器等。我选择了SimpleInjector,因为它速度非常快,不需要任何高级功能 我的理解是SimpleInjector应该在启动时集中配置。从以下项目的基本示例集开始 NS.控制器 核心数据 NS.Core.Data.Model NS.Web NS.WindowsService(假定此服务不会始终运行) 有多个入口点,SimpleInjector的引导应该走到哪里,可以/应该

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

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

  • NS.控制器
  • 核心数据
  • NS.Core.Data.Model
  • NS.Web
  • NS.WindowsService(假定此服务不会始终运行)
有多个入口点,SimpleInjector的引导应该走到哪里,可以/应该集中处理(在这种情况下,配置过程需要引用所有项目才能设置所有解决方案类)

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

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

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

更新:

Steven在下面的评论中提供的链接彻底回答了这个问题


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

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

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


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

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

public class CoreDataPackage : IPackage {
    public void RegisterServices(Container container) {
        container.Register<ISomeService,SomeImplementation>();
        // etc...
    }
}
公共类CoreDataPackage:IPackage{
公共无效注册表服务(容器){
container.Register();
//等等。。。
}
}

您可以集中引导容器,但我个人不会。每个入口点最好配置自己的容器。这并不是说像存储库这样的元素不能在一个地方完成。使用类似Windsor的安装程序可以很方便地做到这一点。您的所有入口点使用容器中注册的完全相同的项目的可能性似乎不太可能,即使它们现在是,将来也可能不是。相关:相关:是一个常用术语,用于指引导容器应该放在哪里。