2012-04-20 23 views
18

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>>() 
+0

¿Qué mensaje

public class ConcreteRepository<ConcreteEntity> : IRepository<IEntity>{} 
no

que 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. –

+0

@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

+0

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

Respuesta

31
kernel.Bind(typeof(IRepository<>)).To(typeof(SimpleRepository<>)); 

Tome un vistazo a mi uno si usted quiere aquí: http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html tengo ejemplos vinculantes

EDITAR:

El error que está recibiendo está diciendo que su repositorio concreto tampoco una instancia de la genérica desea enlazar a, es decir, tendrá que hacer esto

public class ConcreteRepository<ConcreteEntity> : IRepository<ConcreteEntity>{} 
+0

+1 pero no cubriste por qué no funcionaría su caso –

+0

@RubenBartelink hmm entiendo lo que quiere decir, el problema es que el escenario anterior funcionará para el enlace 'IRepository ' a 'ConcreteRepository ' pero no a 'ConcreteRepository '. No estoy seguro de que hubiera Sea una forma de producir este enlace para todos los tipos en Ninject en absoluto. Para obtener este efecto, deberá vincular manualmente cada repositorio. –

+0

Disculpas por la confusión. Estaba tratando de simplificar mi caso de uso al resumirlo, pero creo que solo ofusqué lo que estaba tratando de hacer. Básicamente implementé lo que estás sugiriendo; solo agregué un segundo parámetro de tipo para preservar la interfaz con la entidad en la definición de la clase. – McGarnagle

Cuestiones relacionadas