.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。