如何将 Service Fabric 服务与 AspNet Core WebApi 和 Autofac 以及 运行 TestServer 一起使用

How to use Service Fabric service with AspNet Core WebApi and Autofac and run TestServer

我不知道如何将 AspNet Core 3.1 Web Api 与 Service Fabric 和 Autofac 一起使用,以及如何让它为 TestServer 做好准备 运行 for integration/functional 测试。

文档非常不完整。

Autofac 文档显示了如何修改 Program.cs 以构建 autofac 容器,但它没有提及所有网络 api 都有的 Startup.cs class: https://autofaccn.readthedocs.io/en/latest/integration/servicefabric.html

此外,Autofac 对服务结构的唯一示例不是 Web api:https://github.com/autofac/Examples/tree/master/src/ServiceFabricDemo

还有其他问题没有有效答案: Service Fabric AspNet Core 3.1 Autofac WebHostBuilder

有没有人有任何关于如何实现这一点的例子?

我可以实现以下(请参阅my GitHub repository with the sample

我想要完全相同的东西,但使用 Autofac 作为 DI 容器。


更新 1: 我无法将 Autofac 添加到 WebHostBuilder 并且 ConfigureServices(IServiceCollection services) 根据 AspNet Core 3.1+ 必须为空,所以这就是我被卡住的地方。如何替换示例中的 MS 依赖注入

赏金之后的事件对此没有答案。也许这是不可能的,因为服务结构需要 WebHost 而不是通用主机。

无论如何,我设法让它与旧版本一起工作。这是我的存储库,我在其中展示了一个示例,说明如何在 Service Fabric 下 运行 AspNetCore2.1 与 DotNetCore2.1 (LTS) 和 Autofac。我使用虚拟主机生成器,而不是通用的。

https://gitlab.com/sunnyatticsoftware/training/sasw-aspnetcore-testing/-/tree/master/aspnetcore2_1_autofac_servicefabric

不过,如果最终对问题有一个有效的答案就好了。

我不知道这是否适用于 TestServer。但是在普通托管期间它确实可以正常工作。

您要查找的正是这一行:services.Replace(ServiceDescriptor.Singleton<IServiceProviderFactory<ContainerBuilder>>(new AutofacServiceProviderFactory(null)));

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
    return new[]
    {
        new ServiceInstanceListener(
            serviceContext => new KestrelCommunicationListener(
                serviceContext,
                (url, listener) =>
                    {
                        return WebHost
                            .CreateDefaultBuilder()
                            .ConfigureServices(services =>
                            {
                                services.Replace(ServiceDescriptor.Singleton<IServiceProviderFactory<ContainerBuilder>>(new AutofacServiceProviderFactory(null)));
                                services.AddSingleton(serviceContext)
                            })
                            .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl | ServiceFabricIntegrationOptions.UseReverseProxyIntegration)
                            .UseStartup<TStartupType>()
                            .Build();
                    }))
    };
}

希望对您有所帮助,我花了很长时间才得出这个解决方案。