Soy bastante nuevo en Ninject, y me encontré tropezando cuando llegué a implementar un patrón genérico de repositorio. Quiero unir una dependencia IRepository < IEntityType> a una clase ConcreteRepository < EntityType> donde ConcreteRepository < T> implementa IRepository < T> e implementa EntityType IEntityType. He intentado esto:Cómo enlazar interfaces genéricas en Ninject
kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<EntityType>>();
... pero no voy a tomar Ninject que, ya que no sabe ni le importa que implementa EntityType IEntityType. ¿Cómo puedo vincular esta dependencia?
ACTUALIZACIÓN
Este es el error que estoy recibiendo:
de error 3 El tipo 'ICM.Dependency.Repository.ConcreteRepository' no se puede utilizar como parámetro de tipo 'TImplementation' en el tipo genérico o método 'Ninject.Syntax.IBindingToSyntax.To()'. No hay conversión de referencia implícita de 'ConcreteRepository < EntityType>' a 'IRepository < IEntityType>'.
SOLUCIÓN
Todavía no entiendo por qué mi unión no funciona, pero es evidente que estaba usando genéricos incorrectamente allí. Como tal, la solución realmente no se relaciona con NInject. Terminé especificando el ConcreteRepository para conectar de forma explícita IEntityType con TEntityType:
public class ConcreteRepository<TInterface, TEntity> : IRepository<TInterface> where TEntity : TInterface { ... }
Luego de la inyección se puede escribir de la siguiente manera:
kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<IEntityType,EntityType>>()
¿Qué mensaje
noque son ¿consiguiendo? ¿Es compilación uno o tiempo de ejecución? Hace 'ConcreteRepository' implementar 'IRepository ' (Además, generalmente uno tendría la dependencia del ctor en 'IRepository ' - en cuyo caso su Bind anterior sería incorrecto. –
@RubenBartelink Es un error de compilación; consulte la actualización anterior. Para su primer punto, no es así, pero como se mencionó ConcreteRepository implementa IRepository . Tal vez ese es mi problema. Para su segundo punto, quiero usar IRepository en el constructor para permitir la flexibilidad-- la dependencia del repositorio debe tratar con un interfaz, no entidades concretas. –
McGarnagle
Derecha.Bueno, la restricción 'where' que está causando el error de compilación está ahí por una razón: simplemente no hay forma de que el tipo de componente concreto que sugieres sea convertible al tipo de servicio al que estás 'Vinculado'. ¡deja de mirar! Sugiero ver cómo otros han implementado los patrones genéricos del repositorio: estás lejos de la práctica normal. Podrías explicar lo que obtienes de estas cosas en tu pregunta aquí, pero te sugiero que primero te preguntes a ti mismo y luego quizás aquí si la jerarquía de tu clase puede ser racionalizada. –