在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容器?