HttpContext.RequestServices
또는 IServiceProvider
을 통해 서비스를 요청하는 것이 나쁜 습관을 고려하는 이유는 무엇입니까? 나는 사방이 문장을 읽을 수 있습니다 : 그것을 사용 RequestServices을 얻는 대신 생성자 주입을 사용하는 것이 좋습니다ASP.NET Core DI 생성자 대 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 요청을 캐싱합니다. 생성자에
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
와 내가 호출을 단순화베이스 : 생성자 방식으로
나는 전화 기반의 매우 복잡한 시스템을 얻을
예, BaseService 더 많은 코드를 포함하지만 추가해야 할 때
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의 서비스를 사용하면 모든 클래스 기본 생성자 호출을 수정할 필요가 없습니다. 또한 모든 서비스에는 훨씬 간단한 생성자 (단지
IServiceProvider
)가 있습니다.
만약 내가 생성자 접근에 반대한다면. 수명이 Scoped 인 경우 MyServices에 ServiceProvider.GetRequiredService
을 호출하면 성능이 저하됩니까?
내가 중복 된 질문을 놓치는 이유를 모르지만 나는 기쁘다. 이것은 최고의 대답입니다. – Makla