Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

186
Visualizações
En C #, ¿cómo inyectar todas las instancias de la interfaz genérica en un solo constructor usando la clase base del genérico?

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.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

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 : CustomObject

Esto 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.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda