.net - 如何在 IHostBuilder 扩展中访问 IServiceProvider?
问题描述
拥有net5.0
应用程序,我想利用UseNServiceBus(...)
提供的扩展NServiceBus.Extensions.Hosting
来构建端点,将其包装到一个IHostedService
并在应用程序启动/停止时运行/停止它。
不幸的是,我需要从容器访问其他类才能完全创建EndpointConfiguration
. 这是不可能的,因为没有容器 ( IServiceCollection
) 也没有提供者 ( IServiceProvider
)。
有什么技巧,我可以解析传递给的 lambda 中的服务UseNServiceBus
吗?
就像是:
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();
});
解决方案
调用时还没有IServiceProvider
可用UseNServiceBus
的。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();
});
这当然非常有限,但取决于您的 DI 需求可能会有所帮助。
推荐阅读
- javascript - laravel 中的 ajax 用于创建和更新
- php - 使用视图中的参数调用关系
- python - 当我尝试从数据框中替换“+”时,pandas.DataFrame.replace 不起作用
- spring-security - Spring Security OAuth2 配置 failureUrl 使 url 无法访问
- c# - C# GetWindowRect 返回意外的值
- javascript - 如何在对象数组中查找给定键的索引
- typescript - Typecript error: invalid format: Integer too large
- elasticsearch - 仅适用于 _source 的 Elasticsearch 字段
- python - 根据第二个列表从列表中获取值
- pandoc - 使用 pandoc 遍历具有不同输入的一系列映射