【问题标题】:How to use Service Fabric service with AspNet Core WebApi and Autofac and run TestServer如何将 Service Fabric 服务与 AspNet Core WebApi 和 Autofac 一起使用并运行 TestServer
【发布时间】:2023-04-11 05:03:01
【问题描述】:

我不知道如何将 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

有没有人可以举例说明如何做到这一点?

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

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

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


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

【问题讨论】:

    标签: asp.net-core autofac service-fabric-stateless testserver


    【解决方案1】:

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

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

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

    不过,最终对这个问题有一个有效的答案会很好。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-05-15
        • 1970-01-01
        • 1970-01-01
        • 2016-11-13
        • 2019-08-21
        • 1970-01-01
        • 2019-11-02
        • 2017-05-11
        • 2016-12-13
        相关资源
        最近更新 更多