Как правильно внедрить канал Grpc и службу grpc в ASP.NET MVC (не .NET Core) с особым учетом изящного ShutdownAsync?
У меня есть проект ASP.NET MVC, который использует NInject в качестве IOC и для вызова сервисов grpc с использованием кода.
В настоящее время он используется так (полностью пропуская IOC), который явно имеет много запахов кода.
public class LikeApiController : BaseApiController
{
private readonly Channel _channel;
public LikeApiController()
{
_channel = new Channel(/* port, host, etc ...*/);
}
[HttpPost]
public async Task<IHttpActionResult> LikeAsync(LikeType likeType, long targetId)
{
try
{
ILikeService client = _channel.CreateGrpcService<ILikeService>();
await client.LikeAsync(new LikeRequest /* omitted */);
}
finally
{
await _channel.ShutdownAsync();
}
return Ok();
}
}
Grpc не используется повторно между запросами, что, как я думаю, можно было бы лучше ввести с помощью области Singleton в NInject.
Сервис создан через
CreateGrpcService
и в каждом действии (один раз на запрос, что также является расточительным), хотя я не знаю, сколько накладных расходов требуется для создания службы grpc поверх повторно используемого экземпляра канала grpc.
Несмотря на запах кода, по крайней мере, он строго следует
protobuf-net.Grpc
руководство:
var channel = new Channel("localhost", 10042, ChannelCredentials.Insecure);
try
{
var calculator = channel.CreateGrpcService<ICalculator>();
await Test(calculator);
}
finally
{
await channel.ShutdownAsync();
}
Естественное мышление - переместить создание
Channel
а также
ILikeService
в NInject. На мой взгляд, оба могут быть введены как синглтон.
Осталась проблема только в том, что звонить обязательно
Channel.ShutdownAsync
? Я не мог придумать естественный способ в Ninject. Я мог придумать только два необоснованных варианта:
Пропустить звонок
ShutdownAsync
, что я не уверен в последствиях, учитывая, что сам процесс ASP.NET MVC может быть остановлен чисто или нечистоНазовите это в
MvcApplication.Application_End
. Не уверен, будет ли вызван этот метод в случае нечистого завершения работы.
Спасибо, если кто-нибудь может дать мне указатели.