У меня есть приложение Service Fabric с одной службой, доступной для Интернета (GatewayService) через веб-API ASP.NET, и парой внутренних служб, не подключенных к Интернету (назовем одну из них InternalService). Пока что InternalService также является веб-API ASP.NET, поэтому 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()))
};
}
Класс Startup (в Startup.cs
) для InternalService настраивает некоторые службы, такие как добавление SQL DbContext в систему внедрения зависимостей и, конечно же, настройка ASP.NET с AddMvc()
и т. Д. У меня есть пара ApiController. которые предоставляют API.
Это работает, НО я не получаю никакой реальной безопасности типов с этим, и обычно это делает разработку немного громоздкой, так как необходимо вручную десериализовать результат в моем GatewayService, прежде чем манипулировать им. Поэтому я решил использовать Вместо этого SF использует Service Remoting, что приводит к CreateServiceInstanceListeners()
методу, который выглядит следующим образом:
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return this.CreateServiceRemotingInstanceListeners();
}
Затем я скопировал всю логику из контроллеров в InternalService.cs
, но это привело к проблеме: у меня больше нет доступа к моему DbContext, потому что он был введен в конструктор ApiController, созданный ASP.NET в соответствии с правила установлены в классе Startup
, который больше не используется.
- Могу ли я использовать
Startup
таким же образом при использовании Service Remoting? - Могу ли я разделить API на несколько классов точно так же, как ApiControllers разделяются на несколько классов? Я чувствую, что иметь все открытые методы в одном классе будет довольно неприятно.