Inyección de dependencias anidada en ConfigureServices() de ASP.NET CORE.
Me doy cuenta de que en .NET CORE, la inyección de dependencias (DI) basada en el constructor es bastante sencilla, pero cuando se trata de inyecciones anidadas, tengo problemas.
Aquí está el ejemplo:
public void ConfigureServices(IServiceCollection services)
{
services.AddRavenDbDocStore(x => x.AfterInitializeDocStore = RavenConfiguration.AfterInitializeDocStore());
services.AddRavenDbAsyncSession();
services.AddSingleton(new ExceptionHelper());
services.AddScoped
Sin embargo, cuando necesito registrar un tipo dentro de una lambda de otro registro, tengo problemas para resolver dependencias:
services.AddMvc(setup =>
{
ILogger logger; // ¿cómo lo obtendría?
setup.Filters.Add(new ApiExceptionFilter(logger));
}).AddFluentValidation();
¿Hay una buena manera de manejar esto?
Definitivamente no quiero llamar a esto en ConfigureServices
var sp = services.BuildServiceProvider();
Leí sobre esto en https://stackoverflow.com/questions/32459670/resolving-instances-with-asp-net-core-di-from-within-configureservices, pero no veo una opción elegante aquí.
Actualización:
Después de leer los comentarios, me di cuenta de que se pueden registrar los filtros por tipo:
setup.Filters.Add
Entonces, en primer lugar, no tendría que pasar dependencias.
Todavía me pregunto si hay una mejor práctica para escenarios similares donde no se puede acceder a ServiceProvider en la lambda.
davy.ai
Puede utilizar la interfaz
IServiceProvider
para resolver dependencias dentro de la lambda. Por ejemplo:services.AddMvc(setup =>
{
setup.Filters.Add(sp.GetService<ApiExceptionFilter>());
}).AddFluentValidation();
También puede registrar filtros por tipo, como mencionó:
setup.Filters.Add<ApiExceptionFilter>()
Esta es una buena práctica cuando no necesita pasar dependencias.
Para obtener más información, consulte la documentación de ASP.NET Core Dependency Injection.