问题描述
我不知道如何将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构建器,而不是通用的构建器。
不过,最终对这个问题有一个有效的答案还是很高兴的。
,我不知道这是否适用于 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();
}))
};
}
希望它有所帮助,我花了很长时间才找到这个解决方案。