Можно ли использовать только один IServiceProvider на нескольких контроллерах (т. Е. Как для REST, так и для контроллера GRPC APi) для основного веб-приложения .net? - PullRequest
0 голосов
/ 15 февраля 2019
GRPC API : 


internal class XYZ: Baseclass(Base class for Server-side implementation of Proto file)
  {
    private IServiceProvider _provider;
    public XYZ( IServiceProvider provider)
    {
     _provider = provider;
    }
  }

Аналогично для API остальных:

[Route("[controller]")]
[ApiController]
public class ABC : ControllerBase
{
   public ABC(IServiceProvider provider)
        {
            _provider = provider;
        }
}

Я определяю ServiceProvider в файле запуска в методе Configure.

    var collection = new ServiceCollection();
        collection.AddSingleton<TService, Implementation>();
        var provider = collection.BuildServiceProvider();
 Server server = new Server
            {
                Services = { Proto.BindService(new XYZ(provider)) },
                Ports = { new ServerPort("0.0.0.0", Port, ServerCredentials.Insecure) }
            };

Таким образом, когда я запускаю проект, я могу использовать свой сервис в классе контроллера grpc (XYZ), где же возвращается исключение в случае конструктора Rest Api.Исключение составляет: «Сервис типа TService не зарегистрирован».Так есть ли способ использовать провайдера в обоих конструкторах.? 100100

1 Ответ

0 голосов
/ 15 февраля 2019

Я думаю, что вы неправильно указали значение для конструктора.Вы не должны посылать провайдера.Вы должны поставить свой сервис.Services = { Proto.BindService(new XYZ(provider.GetService(TService) )) }, Поскольку ваш крик класса зависит от TService, а не от ServiceProvider.

Вы можете посмотреть, правильно ли он настроен непосредственно перед созданием сервера, получить экземпляр вызова TService provider.GetService(TService).

Я создал тест и все работает:

public interface ITn
{        
}
public class In : Tn
{
}
public class Startup
{
   public void ConfigureServices(IServiceCollection services)
   {
       var collection = new ServiceCollection();
       collection.AddSingleton<ITn, Tn>();
       var prov = collection.BuildServiceProvider();
       var tn = prov.GetService(typeof(ITn));
    }
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...