Saltar al contenido

Cómo inyectar dependencias de genéricos en ASP.NET Core

Nuestros investigadores estrellas agotaron sus reservas de café, por su búsqueda día y noche por la respuesta, hasta que Victoria halló la respuesta en Gogs y hoy la comparte aquí.

Solución:

Repository es una clase abstracta, por lo que no puede registrarla como una implementación, porque la clase abstracta simplemente no se puede instanciar. Su registro funcionaría bien si Repository no era abstracto.

Si no puede hacer que la clase de repositorio no sea abstracta, puede registrar una implementación específica de su clase de repositorio:

services.AddScoped(typeof(IRepository), typeof(TestRepository));

Esto inyectará correctamente dependencias a su controlador.

Sé que esto es muy tarde, pero estoy publicando mi solución aquí para que otros puedan consultarla y usarla. He escrito algunas extensiones para registrar todos los tipos derivados de interfaz genérica.

public static List GetTypesAssignableTo(this Assembly assembly, Type compareType)

        var typeInfoList = assembly.DefinedTypes.Where(x => x.IsClass 
                            && !x.IsAbstract 
                            && x != compareType
                            && x.GetInterfaces()
                                    .Any(i => i.IsGenericType
                                            && i.GetGenericTypeDefinition() == compareType))?.ToList();

        return typeInfoList;
 

public static void AddClassesAsImplementedInterface(
        this IServiceCollection services, 
        Assembly assembly, 
        Type compareType,
        ServiceLifetime lifetime = ServiceLifetime.Scoped)
 
        assembly.GetTypesAssignableTo(compareType).ForEach((type) =>
        
            foreach (var implementedInterface in type.ImplementedInterfaces)
            
                switch (lifetime)
                
                    case ServiceLifetime.Scoped:
                        services.AddScoped(implementedInterface, type);
                        break;
                    case ServiceLifetime.Singleton:
                        services.AddSingleton(implementedInterface, type);
                        break;
                    case ServiceLifetime.Transient:
                        services.AddTransient(implementedInterface, type);
                        break;
                
            
        );

En la clase de inicio, simplemente registra su interfaz genérica como se muestra a continuación.

services.AddClassesAsImplementedInterface(Assembly.GetEntryAssembly(), typeof(IRepository<>));

Puede encontrar el código de extensión completo en este repositorio de Github.

Más adelante puedes encontrar las explicaciones de otros administradores, tú incluso eres capaz mostrar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *