HttpContext.RequestServices.GetService <T>()与services.AddScope <T>()吗?

时间:2019-11-25 23:19:54

标签: c# asp.net-core dependency-injection

在以下代码中(来自https://github.com/JasonGT/NorthwindTraders/blob/master/Src/WebUI/Controllers/BaseController.cs),它是所有控制器继承的基本控件。

[ApiController]
[Route("api/[controller]/[action]")]
public abstract class BaseController : ControllerBase
{
    private IMediator _mediator;

    protected IMediator Mediator => _mediator ??= HttpContext.RequestServices.GetService<IMediator>();
}

然后,子类控制器仅使用Mediator的属性。

它与仅在services.AddScope<Mediator>();中添加Startup.cs然后注入mediator的区别。

// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    // services.AddSingleton<Mediator>(); 
    services.AddScope<Mediator>();

1 个答案:

答案 0 :(得分:1)

区别在于您不需要将IMediator注入BaseController的构造函数,并且不需要将注入BaseController的所有子类。

因此,它节省了一些样板文件,但也使依赖项不那么明确。

旁注,Microsoft建议比RequestServices更喜欢注入

  

通过HttpContext.RequestServices集合公开来自HttpContext的ASP.NET Core请求中可用的服务。

     

请求服务代表作为应用程序的一部分进行配置和请求的服务。当对象指定依赖项时,它们可以通过RequestServices中的类型满足,而不是ApplicationServices。

     

通常,应用程序不应直接使用这些属性。而是通过类构造函数请求类所需的类型,并允许框架注入依赖项。这样产生的类易于测试。

     

注意

     

在访问RequestServices集合时,最好将请求依赖项作为构造函数参数。

请参见Microsoft docs