1

我不知道如何将 AspNet Core 3.1 Web Api 与 Service Fabric 和 Autofac 一起使用,以及如何让它准备好让 TestServer 运行以进行集成/功能测试。

文档非常不完整。

Autofac 文档显示了如何修改Program.cs以构建 autofac 容器,但它没有提及所有 web api 都具有的 Startup.cs 类: 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

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

我可以实现以下(请参阅我的 GitHub 存储库与示例

  • 具有无状态 AspNet Core WebApi 项目的服务结构(dotnet core 3.1)
  • 使用 Microsoft Dependency Injection 注册服务
  • 使用 TestServer 在 http 端点上运行集成测试,并且能够以干净的方式覆盖依赖注入注册,而无需创建另一个 Startup 类

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


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

4

2 回答 2

0

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

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

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

尽管如此,最终对这个问题有一个有效的答案还是很好的。

于 2020-10-15T11:52:22.607 回答
0

我不知道这是否适用于 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();
                    }))
    };
}

希望它有所帮助,我花了很长时间才找到这个解决方案。

于 2021-02-26T11:38:51.047 回答