【发布时间】:2018-05-30 08:08:42
【问题描述】:
为什么通过HttpContext.RequestServices 或IServiceProvider 请求服务被认为是不好的做法。我到处都能读到这句话:
建议使用构造函数注入,而不是获取它 使用 RequestServices。
我的想法正好相反。尽可能使用 RequestServices。让我解释一下为什么。 我想让控制器尽可能小,所以我创建了单独的服务。这样,我的控制器就干净了:
public class MyController : Controller
{
public MyController(IMyServices MyServices){}
public async Task<IActionResult> GetSomething(int parameter)
{
return await this.MyServices.SomeMethod(parameter);
}
}
所有服务都继承自base,其中包含管理权限、缓存sql请求的逻辑......
使用构造函数方法,我得到了非常复杂的调用 base 系统:
public class MyBaseService
{
public MyBaseService(ILogger Logger, AppDbContext Context, IMemoryCache Cache) { }
public bool HasRight(string right) { return true; }
public bool IsLoggedIn() { return true; }
}
public class MyServices : MyBaseService
{
public MyServices(ILogger Logger, AppDbContext Context, IMemoryCache Cache) : base(Logger, Context, Cache)
{
}
}
但是使用GetRequiredService 我简化了基于构造函数的调用:
public class MyBaseService2
{
private ServiceProvider _ServiceProvider;
public MyBaseService2(IServiceProvider ServiceProvider)
{
}
protected ILogger Logger { get { return this._ServiceProvider.GetRequiredService<ILogger>(); } }
protected AppDbContext Context { get { return this._ServiceProvider.GetRequiredService<AppDbContext>(); } }
protected IMemoryCache Cache { get { return this._ServiceProvider.GetRequiredService<IMemoryCache>(); } }
public bool HasRight(string right) { return true; }
public bool IsLoggedIn() { return true; }
}
public class MyServices2 : MyBaseService2
{
public MyServices2(IServiceProvider ServiceProvider) : base(ServiceProvider)
{
}
}
是的,BaseService 包含更多代码,但是当我需要 BaseService 中的其他服务时,无需修复每个类基构造函数调用。而且我所有的服务都有更简单的构造函数(只是IServiceProvider)。
如果我反对构造方法。如果生命周期为 Scoped,则为 MyServices 调用 ServiceProvider.GetRequiredService 是否会影响性能。
【问题讨论】:
标签: c# dependency-injection asp.net-core .net-core