在以下代码中(来自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>();
答案 0 :(得分:1)
区别在于您不需要将IMediator
注入BaseController的构造函数,并且不需要将注入BaseController的所有子类。
因此,它节省了一些样板文件,但也使依赖项不那么明确。
旁注,Microsoft建议比RequestServices
更喜欢注入
通过HttpContext.RequestServices集合公开来自HttpContext的ASP.NET Core请求中可用的服务。
请求服务代表作为应用程序的一部分进行配置和请求的服务。当对象指定依赖项时,它们可以通过RequestServices中的类型满足,而不是ApplicationServices。
通常,应用程序不应直接使用这些属性。而是通过类构造函数请求类所需的类型,并允许框架注入依赖项。这样产生的类易于测试。
注意
在访问RequestServices集合时,最好将请求依赖项作为构造函数参数。