He definido la siguiente interfaz:
public interface ICustomService<T> where T : CustomObject { IEnumerable<T> GetById(int Id); ... } Y 2 implementaciones donde MyObject1 y MyObject2 heredan de CustomObject
public class CustomService1 : ICustomService<MyObject1> { public IEnumerable<MyObject1> GetById(int Id) { ... } } public class CustomService2 : ICustomService<MyObject2> { public IEnumerable<MyObject2> GetById(int Id) { ... } } Intento registrar ambos como ICustomService<CustomObject> pero aparece el error:
No hay una conversión de referencia implícita de 'CustomerService1' a 'ICustomService<CustomObject>'
En lugar de registrarse así:
services.AddTransient<ICustomService<MyObject1>, CustomService1>(); services.AddTransient<ICustomService<MyObject2>, CustomService2>(); Al registrarme como arriba, mis services IEnumerable están vacíos:
public ThirdService(IEnumerable<ICustomService<CustomObject>> services) { } ¿Cómo puedo inyectar toda la implementación de ICustomService en ThirdService ?
Estoy tratando de hacer esto para que ThirdService pueda recibir una identificación y luego obtener todos los CustomObject con esa identificación usando GetById en todos los servicios.
Suponiendo que no haya métodos de interfaz adicionales que tengan parámetros de tipo T , propiedades mutables de tipo T o métodos que devuelvan un tipo genérico que use T de forma no covariante, puede hacer que T sea covariante utilizando out
public interface ICustomService<out T> where T : CustomObjectEsto haría que su intento de registro fuera válido:
services.AddTransient<ICustomService<MyObject>, CustomService1>(); services.AddTransient<ICustomService<MyObject>, CustomService2>(); La covarianza garantiza que CustomService1 y CustomService2 se puedan usar de forma segura en lugar de ICustomService<MyObject> , a pesar de que ambos declaran una subclase de MyObject como argumento genérico.