如何将 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)
- 具有无状态 AspNet Core Web 的服务结构Api 项目 (dotnet core 3.1)
- 使用 Microsoft 依赖注入注册服务
- 使用 TestServer 运行 在 http 端点上进行集成测试,并且能够以干净的方式覆盖依赖注入注册 而无需创建另一个 Startup class
我想要完全相同的东西,但使用 Autofac 作为 DI 容器。
更新 1:
我无法将 Autofac 添加到 WebHostBuilder
并且 ConfigureServices(IServiceCollection services)
根据 AspNet Core 3.1+ 必须为空,所以这就是我被卡住的地方。如何替换示例中的 MS 依赖注入
赏金之后的事件对此没有答案。也许这是不可能的,因为服务结构需要 WebHost 而不是通用主机。
无论如何,我设法让它与旧版本一起工作。这是我的存储库,我在其中展示了一个示例,说明如何在 Service Fabric 下 运行 AspNetCore2.1 与 DotNetCore2.1 (LTS) 和 Autofac。我使用虚拟主机生成器,而不是通用的。
不过,如果最终对问题有一个有效的答案就好了。
我不知道这是否适用于 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();
}))
};
}
希望对您有所帮助,我花了很长时间才得出这个解决方案。
我不知道如何将 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)
- 具有无状态 AspNet Core Web 的服务结构Api 项目 (dotnet core 3.1)
- 使用 Microsoft 依赖注入注册服务
- 使用 TestServer 运行 在 http 端点上进行集成测试,并且能够以干净的方式覆盖依赖注入注册 而无需创建另一个 Startup class
我想要完全相同的东西,但使用 Autofac 作为 DI 容器。
更新 1:
我无法将 Autofac 添加到 WebHostBuilder
并且 ConfigureServices(IServiceCollection services)
根据 AspNet Core 3.1+ 必须为空,所以这就是我被卡住的地方。如何替换示例中的 MS 依赖注入
赏金之后的事件对此没有答案。也许这是不可能的,因为服务结构需要 WebHost 而不是通用主机。
无论如何,我设法让它与旧版本一起工作。这是我的存储库,我在其中展示了一个示例,说明如何在 Service Fabric 下 运行 AspNetCore2.1 与 DotNetCore2.1 (LTS) 和 Autofac。我使用虚拟主机生成器,而不是通用的。
不过,如果最终对问题有一个有效的答案就好了。
我不知道这是否适用于 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();
}))
};
}
希望对您有所帮助,我花了很长时间才得出这个解决方案。