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ámetroproveedor
)
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.
davy.ai
El problema es que
FooHttpApiHostModule
no tiene un constructor sin parámetros, y en la claseStartup
, está intentando usarservices.AddApplication<foohttpapihostmodule>()
, que requiere un constructor sin parámetros. Una forma de inyectarICustomContext
enFooHttpApiHostModule
es utilizar inyección de propiedades en lugar de inyección de constructores. Para hacer esto, elimina el constructor deFooHttpApiHostModule
y crea una propiedad pública paraICustomContext
. Luego, dentro del métodoConfigureServices
deFooHttpApiHostModule
, usacontext.Services.GetRequiredService<icustomcontext>()
para obtener la instancia requerida deICustomContext
y asígnala a la propiedad pública deFooHttpApiHostModule
.El código actualizado se vería algo así:
Luego, en la clase
Startup
, puedes utilizarservices.ConfigureApplication<foohttpapihostmodule>(module => module.CustomContext = services.GetRequiredService<icustomcontext>())
para configurarFooHttpApiHostModule
con la instancia requerida deICustomContext
.Esto debería permitir que
FooHttpApiHostModule
obtenga la instancia requerida deICustomContext
sin utilizar inyección de constructores.