Получить текущий IServiceScope в контроллере - PullRequest
0 голосов
/ 27 февраля 2020

Как можно получить экземпляр текущего (по запросу) IServiceScope в контроллере? В службе?

Планируется использовать ее для разрешения служб, принадлежащих к той же области.

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

получить экземпляр ... в контроллере :

  1. Нет необходимости использовать IHttpContextAccessor в контроллер . Уже есть HttpContext свойство для вас. Если вы хотите получить доступ к HttpContext, просто

    // no need to use IHttpContextAccessor.HttpContext
    var svc = HttpContext.RequestServices.GetService<MyService>();
    
  2. Или, в качестве альтернативы, введите IServiceProvider напрямую:

    public class MyController : Controller
    {
        private IServiceProvider _sp;
        public MyController(IServiceProvider sp)
        {
            this._sp = sp;
        }
    }
    

    и при желании небольшую область, вы можете создать ее, как показано ниже:

    public IActionResult MyActoin()
    {
        // create a more small scope
        using (var scope = this._sp.CreateScope())
        {
            var sp = scope.ServiceProvider;
            // now you get the services from this small scope
            var svc1 = sp.GetRequiredService<MyService1>();
            var svc2 = sp.GetRequiredService<MyService2>();
            //...
        }
        return new JsonResult("it works");
    }
    
  3. В частности, если требуемая область обслуживания является точно областью запроса, просто введите их все:

    public class MyController : Controller
    {
        private IServiceProvider _sp;
        private readonly MyService1 _service1;
        private readonly MyService2 _service2;
    
        public MyController(IServiceProvider sp, MyService1 service1, MyService2 service2,...)
        {
            this._sp = sp;
            this._service1 = service1;
            this._service2 = service2;
        }
    
0 голосов
/ 27 февраля 2020

Одно из решений - запросить IHttpContextAccessor contextAccessor в конструкторе контроллера, а затем разрешить из него нужные службы:

var svc = contextAccessor.HttpContext.RequestServices.GetService<MyService>();

...