如何解决如何在 IHostBuilder 扩展中访问 IServiceProvider?
拥有 net5.0
应用程序,我想利用 UseNServiceBus(...)
提供的 NServiceBus.Extensions.Hosting
扩展来构建端点,将其包装到 IHostedService
并在应用程序上运行/停止它开始/停止。
不幸的是,我需要从容器访问其他类才能完全创建 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();
});
解决方法
在调用 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 需求可能会有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。