.net 如何在IHostBuilder扩展中访问IServiceProvider?
有了.net 如何在IHostBuilder扩展中访问IServiceProvider?,.net,dependency-injection,nservicebus,.net,Dependency Injection,Nservicebus,有了net5.0app,我想利用UseNServiceBus(…)由NServiceBus.Extensions.Hosting提供的扩展来构建端点,将其包装到IHostedService并在app start/stop上运行/停止它 不幸的是,我需要从容器访问其他类才能完全创建EndpointConfiguration。这是不可能的,因为既没有容器(IServiceCollection),也没有提供程序(IServiceProvider) 有什么诀窍吗,我可以解析传递给UseNServiceB
net5.0
app,我想利用UseNServiceBus(…)
由NServiceBus.Extensions.Hosting
提供的扩展来构建端点,将其包装到IHostedService
并在app start/stop上运行/停止它
不幸的是,我需要从容器访问其他类才能完全创建EndpointConfiguration
。这是不可能的,因为既没有容器(IServiceCollection
),也没有提供程序(IServiceProvider
)
有什么诀窍吗,我可以解析传递给UseNServiceBus
的lambda中的服务吗?
比如:
hostBuilder
.ConfigureServices((hostContext, services) =>
{
services
.AddSingleton<CoolEndpointConfigBuilder>()
.AddSingleton<SomeDependency>(sp =>
{
/*
* We can access sp in this context to resolve anything
* helpful in the process of SomeDependency's creation
*/
})
.AddOtherDependencies()
;
})
.UseNServiceBus(hostContext =>
{
// How to get it here?
IServiceProvider sp = PerformSomeVooDooToGetServiceProvider();
var cecb = sp.GetRequiredService<CoolEndpointConfigBuilder>();
/*
* Which assembles EndpointConfiguration using the myriad of classes
* injected to the CoolEndpointConfigBuilder's constructor
*/
return cecb.Build();
});
主机生成器
.ConfigureServices((主机上下文,服务)=>
{
服务
.AddSingleton()
.AddSingleton(sp=>
{
/*
*我们可以在此上下文中访问sp来解决任何问题
*在SomeDependency的创建过程中很有帮助
*/
})
.AddOtherDependencies()
;
})
.UseNServiceBus(主机上下文=>
{
//怎么到这里?
IServiceProvider sp=PerformSomeVooDooToGetServiceProvider();
var cecb=sp.GetRequiredService();
/*
*它使用大量的类来组装EndpointConfiguration
*注入CoolEndpointConfigBuilder的构造函数
*/
返回cecb.Build();
});
调用
UseNServiceBus
时,还没有可用的IServiceProvider
UseNServiceBus
在内部也仅使用IHostBuilder.ConfigureServices,因此它仅限于相同的约束。您正在尝试从容器解析服务,而主机尚未创建IServiceProvider
。NServiceBus还需要由主机管理的DI容器,因此在仍在配置NServiceBus时,无法解决依赖关系。
本质上,您应该能够在不需要依赖项注入的情况下配置端点。为什么您的配置需要DI
如果您真的想绕过这个问题(我强烈建议不要这样做),您可以在配置时为您需要的类型创建一个临时DI容器,例如
hostBuilder
.UseNServiceBus(hostContext =>
{
var tempServiceCollection = new ServiceCollection();
tempServiceCollection.AddSingleton<CoolEndpointConfigBuilder>();
var tempServiceProvider = tempServiceCollection.BuildServiceProvider();
var cecb = tempServiceProvider.GetRequiredService<CoolEndpointConfigBuilder>();
return cecb.Build();
});
主机生成器
.UseNServiceBus(主机上下文=>
{
var tempServiceCollection=newservicecolection();
tempServiceCollection.AddSingleton();
var tempServiceProvider=tempServiceCollection.BuildServiceProvider();
var cecb=tempServiceProvider.GetRequiredService();
返回cecb.Build();
});
这当然是非常有限的,但取决于您的DI需求可能会有所帮助。要补充@sabacc所说的内容:MS明确指出,您应该避免在他们的建议中使用
BuildServiceProvider
,是的,就像这条评论一样。您不应该希望在NServiceBus的配置中使用IServiceProvider。它们唯一需要的就是i配置
和i外部环境
。您的处理程序和saga与标准dotnet核心共享DI。