Как можно получить экземпляр текущего (по запросу) IServiceScope в контроллере? В службе?
IServiceScope
Планируется использовать ее для разрешения служб, принадлежащих к той же области.
получить экземпляр ... в контроллере :
Нет необходимости использовать IHttpContextAccessor в контроллер . Уже есть HttpContext свойство для вас. Если вы хотите получить доступ к HttpContext, просто
IHttpContextAccessor
HttpContext
// no need to use IHttpContextAccessor.HttpContext var svc = HttpContext.RequestServices.GetService<MyService>();
Или, в качестве альтернативы, введите IServiceProvider напрямую:
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"); }
В частности, если требуемая область обслуживания является точно областью запроса, просто введите их все:
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; }
Одно из решений - запросить IHttpContextAccessor contextAccessor в конструкторе контроллера, а затем разрешить из него нужные службы:
IHttpContextAccessor contextAccessor
var svc = contextAccessor.HttpContext.RequestServices.GetService<MyService>();