在C#.NET Core中,您可以使用以下代码创建通用主机:
这个网络主机将拥有自己的依赖注入容器,因此它将无法访问我已经添加到通用主机容器中的所有依赖项:也就是说,它将无法将IMyClass注入MyStartup。
我还尝试使用以下代码添加自定义的IServiceProviderFactory(基于.UseDefaultServiceProvider()代码,其中它们使用IServiceCollection作为构建器类型)。
在我的
然而,鉴于
如何让Web主机使用与初始泛型主机相同的DI容器?
IHostBuilder builder = new HostBuilder()
.ConfigureServices((context, collection) => {
collection.AddSingleton<IMyClass, MyClass>();
collection.AddHostedService<MyService>();
});
await builder.RunConsoleAsync();
这将使用默认的 DI 容器创建 MyService
新实例。
现在,假设我想在 MyService
内部创建一个新主机。这很容易(在本例中是 Web 主机):
IWebHost webHost = WebHost.CreateDefaultBuilder()
.UseStartup<MyStartup>()
.Build();
.RunAsync();
这个网络主机将拥有自己的依赖注入容器,因此它将无法访问我已经添加到通用主机容器中的所有依赖项:也就是说,它将无法将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))
添加它,但由于这是在创建之前实例化HostedService
,导致DI异常,报告找不到所需的对象。然而,鉴于
WebHost.CreateDefaultBuilder()
现在是创建Web主机的首选方法(在.NET Core 3.0中),并且IWebHostBuilder
没有设置自定义IServiceProviderFactory
的选项,因此这似乎是一个死胡同。如何让Web主机使用与初始泛型主机相同的DI容器?