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

问题描述

我不知道如何将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用于服务结构的唯一示例也不是网络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依赖注入来注册服务
  • 使用TestServer在http端点上运行集成测试,并能够以干净的方式覆盖依赖项注入注册而无需创建另一个Startup类

我希望完全一样,但是使用Autofac作为DI容器。


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

解决方法

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

无论如何,我设法使其与旧版本一起使用。这是我的存储库,其中显示了有关如何在Service Fabric下使用DotNetCore2.1(LTS)和Autofac运行AspNetCore2.1的示例。我使用的是Webhost构建器,而不是通用的构建器。

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();
                    }))
    };
}

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...