Как правильно внедрить канал 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. Я мог придумать только два необоснованных варианта:

  1. Пропустить звонок ShutdownAsync, что я не уверен в последствиях, учитывая, что сам процесс ASP.NET MVC может быть остановлен чисто или нечисто

  2. Назовите это в MvcApplication.Application_End. Не уверен, будет ли вызван этот метод в случае нечистого завершения работы.

Спасибо, если кто-нибудь может дать мне указатели.

0 ответов

Другие вопросы по тегам