This question already has an answer here:
Why is requesting services via HttpContext.RequestServices or IServiceProvider consider bad practise. I can read this statement all over the place:
It is recommended to use constructor injection instead of getting it using RequestServices.
My idea is just the opposite. Use RequestServices where ever possible. Let me explain why. I want to keep controllers as small as possible so I create separate services. This way, my controllers are clean:
public class MyController : Controller { public MyController(IMyServices MyServices){} public async Task<IActionResult> GetSomething(int parameter) { return await this.MyServices.SomeMethod(parameter); } } All services inherit from base, which contains logic for managing rights, caching sql requests ... .
With constructor approach I get very complicated system of calling 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) { } } but with GetRequiredService I simplify calling base on constructor:
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) { } } Yes, BaseService contains more code, but when I need additional services in BaseService, there is no need to fix every class base constructor call. Also all my services have much simpler constructor (just IServiceProvider).
If I go against constructor approach. Is there any performance hit if calling ServiceProvider.GetRequiredService for MyServices if there lifetime is Scoped.