C# 如何在多个DI容器之间共享服务

C# 如何在多个DI容器之间共享服务,c#,dependency-injection,background-service,C#,Dependency Injection,Background Service,我有一个NetCore web应用程序,它有一个web主机和一些后台服务。后台服务在与Web主机不同的上下文中运行-它们不是通过Web主机上的.addHostedService启动的。它们在main()中启动 我正在使用依赖注入。每个主机最终都将获得自己的容器,该容器将在Build()期间创建。我有一个主机间共享的单例服务MessageBus,以及其他瞬态和静态服务。由于主机外部没有“全局”容器,所以我需要手动注入这些容器。我找到了两种方法——1)创建静态和静态工厂,并注入这些 static

我有一个NetCore web应用程序,它有一个web主机和一些后台服务。后台服务在与Web主机不同的上下文中运行-它们不是通过Web主机上的.addHostedService启动的。它们在
main()
中启动

我正在使用依赖注入。每个主机最终都将获得自己的容器,该容器将在
Build()
期间创建。我有一个主机间共享的单例服务
MessageBus
,以及其他瞬态和静态服务。由于主机外部没有“全局”容器,所以我需要手动注入这些容器。我找到了两种方法——1)创建静态和静态工厂,并注入这些

  static MessageBus mb = new MessageBus();
  static TransientFactory<T> tf = new TransitentFactory<T>();
  
  var businessHostConfig = Host.CreateDefaultBuilder()  
    .ConfigureServices((hostContext, services) => {
      services.AddSingleton(mb);
      service.AddSingleton(tf)
  }).Build();
  
static MessageBus mb=new MessageBus();
静态瞬态工厂tf=新的瞬态工厂();
var businessHostConfig=Host.CreateDefaultBuilder()
.ConfigureServices((主机上下文,服务)=>{
服务。AddSingleton(mb);
service.AddSingleton(tf)
}).Build();
这不是一个很好的方法,像这样的工厂更像是一个定位器和DI反模式

或者2)在静态构造函数中创建全局容器

class Program {
  static Program() {
    private static readonly IServiceCollection ServiceCollection = new ServiceCollection();
    private static readonly IServiceProvider ServiceProvider;
    
    ServiceCollection.AddSingleton<MessageBus>();
    ServiceCollection.Add... // another common service
    
    ServiceProvider = ServiceCollection.BuildServiceProvider();
  }
  
  var businessHostConfig = Host.CreateDefaultBuilder()  
    .ConfigureServices((hostContext, services) => {
      services.AddSingleton(ServiceProvider.GetRequiredService<MessageBus>())
      services.Add... // another common service
  }).Build();  
  
}
类程序{
静态程序(){
私有静态只读IServiceCollection ServiceCollection=新ServiceCollection();
专用静态只读服务器ViceProvider服务提供商;
ServiceCollection.AddSingleton();
ServiceCollection.Add…//另一个公共服务
ServiceProvider=ServiceCollection.BuildServiceProvider();
}
var businessHostConfig=Host.CreateDefaultBuilder()
.ConfigureServices((主机上下文,服务)=>{
services.AddSingleton(ServiceProvider.GetRequiredService())
services.Add…//另一个公共服务
}).Build();
}
更好的是,我有一个容器来管理生命周期,但我仍然需要手动将全局提供程序中的每个服务添加到每个主机中

我正在寻找一种“级联”服务解析的方法—查看主机容器,如果找不到,则查看全局容器。或者,如果没有这一点,这是一种将全球服务“批量复制”到本地容器中的好方法

现在我有一个复制的流程,但它必须检查
服务集合
,以识别服务(
服务提供者
被锁得很紧,我没有找到直接到集合对服务执行
forEach
),然后在提供者上找到每个服务,创建一个具有正确生存期的
ServiceDescriptor
,然后添加它。很乱

class Program {
  static Program() {
    private static readonly IServiceCollection ServiceCollection = new ServiceCollection();
    private static readonly IServiceProvider ServiceProvider;
    
    ServiceCollection.AddSingleton<MessageBus>();
    ServiceCollection.Add... // another common service
    
    ServiceProvider = ServiceCollection.BuildServiceProvider();
  }
  
  var businessHostConfig = Host.CreateDefaultBuilder()  
    .ConfigureServices((hostContext, services) => {
      services.AddSingleton(ServiceProvider.GetRequiredService<MessageBus>())
      services.Add... // another common service
  }).Build();  
  
}