我有一个 Service Fabric 应用程序,其中一个服务通过 ASP.NET Web API向 Internet ( GatewayService ) 公开,另外还有几个未向 Internet 公开的内部服务(我们称其中一个为InternalService)。到目前为止,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 类 (in Startup.cs
)配置了一些服务,例如将 SQL DbContext 添加到依赖注入系统,当然还有设置 ASP.NET等。我有几个公开 API 的 ApiController。AddMvc()
这行得通,但是我没有得到任何真正的类型安全性,而且它通常使开发有点麻烦,需要在操作之前在我的 GatewayService 中手动反序列化结果。所以我决定改用SF 的 Service Remoting,得到的CreateServiceInstanceListeners()
方法如下所示:
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return this.CreateServiceRemotingInstanceListeners();
}
然后我将控制器中的所有逻辑也复制到其中InternalService.cs
,但这导致了一个问题:我无法再访问我的 DbContext,因为它被注入到 ApiController 的构造函数中,由 ASP.NET 根据规则进行实例化在Startup
类中设置,不再使用。
Startup
使用 Service Remoting 时,有没有办法让我以同样的方式使用?- 我可以将 API 分成多个类,就像将 ApiController 分成多个类一样吗?我觉得将所有暴露的方法放在同一个类中会很麻烦。