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.

El uso de DI utilizando el constructor no funciona porque se requiere un objeto con un constructor sin parámetros.

Hay una clase que utiliza algunas dependencias que se obtendrán desde el constructor.

public class FooHttpApiHostModule : AbpModule
{
    private readonly ICustomContext _customContext;

    public FooHttpApiHostModule(ICustomContext customContext)
    {
        _customContext = customContext;
    }

    // Otro código aquí.
}

Dentro del ApplicationModule, se agrega un alcance para ello.

public class FooApplicationModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        context.Services
            .AddScoped<ICustomContext, CustomContext>();
    }
}

Pero cuando se ejecuta el código, ocurre la siguiente excepción:

System.MissingMethodException: No se puede crear dinámicamente una instancia del tipo FooHttpApiHostModule.
Motivo: No se ha definido un constructor sin parámetros.

La excepción ocurre dentro de la clase Startup en la siguiente línea.

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddApplication<FooHttpApiHostModule>(); // <-- Excepción en esta línea.
    }
}

¿Existe alguna otra forma de inyectar ICustomContext en FooHttpApiHostModule?


Actualización 1:

Al escribir esta línea en el ConfigureServices de mi FooHttpApiHostModule

var graphContext = context.Services.GetRequiredService<ICustomContext>();

Ocurre el siguiente error:

System.ArgumentNullException: El valor no puede ser nulo.
(Parámetro proveedor)

Código completo:

public class FooHttpApiHostModule : AbpModule
{
    // Se eliminó el constructor y la variable de sólo lectura.

    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        ICustomContext customContext = context.Services.GetRequiredService<ICustomContext>(); // <-- excepción en esta línea.
    }

    // Otro código aquí...
}

Realicé una comprobación adicional y ICustomContext está agregado al alcance.

context.Services.IsAdded<ICustomContext><noscript><img decoding=

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema es que FooHttpApiHostModule no tiene un constructor sin parámetros, y en la clase Startup, está intentando usar services.AddApplication<foohttpapihostmodule>(), que requiere un constructor sin parámetros. Una forma de inyectar ICustomContext en FooHttpApiHostModule es utilizar inyección de propiedades en lugar de inyección de constructores. Para hacer esto, elimina el constructor de FooHttpApiHostModule y crea una propiedad pública para ICustomContext. Luego, dentro del método ConfigureServices de FooHttpApiHostModule, usa context.Services.GetRequiredService<icustomcontext>() para obtener la instancia requerida de ICustomContext y asígnala a la propiedad pública de FooHttpApiHostModule.

    El código actualizado se vería algo así:

    public class FooHttpApiHostModule : AbpModule
    {
        public ICustomContext CustomContext { get; set; }
    
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            CustomContext = context.Services.GetRequiredService<icustomcontext>();
        }
    
        // Otro código aquí...
    }
    

    Luego, en la clase Startup, puedes utilizar services.ConfigureApplication<foohttpapihostmodule>(module => module.CustomContext = services.GetRequiredService<icustomcontext>()) para configurar FooHttpApiHostModule con la instancia requerida de ICustomContext.

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.ConfigureApplication<foohttpapihostmodule>(module =>
            {
                module.CustomContext = services.GetRequiredService<icustomcontext>();
            });
        }
    }
    

    Esto debería permitir que FooHttpApiHostModule obtenga la instancia requerida de ICustomContext sin utilizar inyección de constructores.

Comments are closed.