es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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(x => new CompoundService(x.GetService(), x.GetService()));

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.

Tags:  ,

Answer

  1. Avatar for 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.

Comments are closed.