具有相同DI容器的多个主机

时间:2019-08-30 18:58:28

标签: c# dependency-injection .net-core

在C#.NET Core中,您可以使用以下代码创建通用主机:

IHostBuilder builder = new HostBuilder()
    .ConfigureServices((context, collection) => {
        collection.AddSingleton<IMyClass, MyClass>();
        collection.AddHostedService<MyService>();
    });
await builder.RunConsoleAsync();

这将使用默认的DI容器创建MyService的新实例。

现在,说我想在MyService内创建一个新主机。这很容易(在这种情况下是网络主机):

IWebHost webHost = WebHost.CreateDefaultBuilder()
    .UseStartup<MyStartup>()
    .Build();
    .RunAsync();

此虚拟主机将有其自己的依赖项注入容器,因此它将不能访问我已经添加到通用宿主容器中的所有依赖项:即它将无法拥有{{ 1}}注入了IMyClass

我还尝试使用以下代码(基于MyStartup代码,其中他们使用IServiceProviderFactory<>作为构建器类型)添加自定义.UseDefaultServiceProvider()

IServiceCollection

然后在我的public class CustomServiceProviderFactory : IServiceProviderFactory<IServiceCollection> { private readonly IServiceProvider _provider; public CustomServiceProviderFactory(IServiceProvider provider) { _provider = provider; } public IServiceCollection CreateBuilder(IServiceCollection services) { return services; } public IServiceProvider CreateServiceProvider(IServiceCollection containerBuilder) { return _provider; } } 中通过HostBuilder添加了它,但是由于某种原因.UseServiceProviderFactory(new CustomServiceProviderFactory(_serviceProvider))在创建之前被实例化,导致DI找不到所需对象的异常。

不过,现在看到HostedService是创建虚拟主机(in .NET Core 3.0)的首选方式,而WebHost.CreateDefaultBuilder()确实没有 选项自定义IWebHostBuilder似乎是死路一条。

我如何让Web主机使用与初始通用主机相同的DI容器?

0 个答案:

没有答案