【发布时间】:2020-07-06 22:42:17
【问题描述】:
我有一个 Service Fabric 应用程序,其中一个服务通过 ASP.NET Web API 暴露给 Internet (GatewayService),还有几个内部服务不暴露给 Internet(我们称之为他们内部服务)。到目前为止,InternalService 也是一个 ASP.NET Web API,所以 InternalService.cs 有一个 CreateServiceInstanceListeners() 方法,如下所示:
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new[] {
new ServiceInstanceListener(serviceContext =>
new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
WebHost.CreateDefaultBuilder()
.UseStartup<Startup>()
.ConfigureServices((context, services) => { services.AddSingleton(serviceContext); })
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
.UseUrls(url)
.Build()))
};
}
InternalService 的 Startup 类(在 Startup.cs 中)配置一些服务,例如向依赖注入系统添加 SQL DbContext,当然还有使用 AddMvc() 设置 ASP.NET 等. 我有几个暴露 API 的 ApiControllers。
这行得通,但是我没有得到任何真正的类型安全,而且它通常使开发有点麻烦,需要在我的 GatewayService 中手动反序列化结果,然后再操作它。所以我决定改用SF's Service Remoting,导致CreateServiceInstanceListeners() 方法看起来像这样:
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return this.CreateServiceRemotingInstanceListeners();
}
然后我将控制器中的所有逻辑也复制到InternalService.cs,但这导致了一个问题:我无法再访问我的 DbContext,因为它被注入到 ApiController 的构造函数中,由 ASP 实例化.NET 根据Startup 类中设置的规则,不再使用。
- 在使用 Service Remoting 时,有没有办法让我以同样的方式使用
Startup? - 我可以将 API 分成多个类,就像将 ApiController 分成多个类一样吗?我觉得将所有公开的方法都放在同一个类中会很麻烦。
【问题讨论】:
标签: c# asp.net azure-service-fabric service-fabric-stateless service-fabric-remoting