usar usando tipos porque objeto interfaces implementacion genericos generico genericas crear c# generics dependency-injection ninject generic-interface

usando - tipos genericos en c#



Cómo enlazar interfaces de tipo genérico en Ninject (1)

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

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

EDITAR:

El error que está obteniendo indica que su repositorio concreto no es una instancia del genérico al que desea enlazar, es decir, tendrá que hacer esto

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

no

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

Soy bastante nuevo en Ninject, y me encontré tropezando cuando llegué a implementar un patrón de repositorio genérico. Quiero vincular una dependencia IRepository <IEntityType> a una clase ConcreteRepository <EntityType> donde ConcreteRepository <T> implementa IRepository <T> y EntityType implementa IEntityType. Intenté esto:

kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<EntityType>>();

... pero Ninject no lo tomará porque no sabe o le importa que EntityType implemente IEntityType. ¿Cómo puedo ir atando esta dependencia?

ACTUALIZAR

Este es el error que estoy recibiendo:

Error 3 El tipo ''ICM.Dependency.Repository.ConcreteRepository'' no se puede usar como parámetro de tipo ''TImplementation'' en el tipo o método genérico ''Ninject.Syntax.IBindingToSyntax.To ()''. No hay una conversión de referencia implícita de ''ConcreteRepository <EntityType>'' a ''IRepository <IEntityType>''.

SOLUCIÓN

Todavía no entiendo bien por qué mi enlace no funciona, pero evidentemente estaba usando genéricos de forma incorrecta allí. Como tal, la solución no se relaciona realmente con NInject. Terminé de especificar ConcreteRepository para conectar explícitamente IEntityType con TEntityType:

public class ConcreteRepository<TInterface, TEntity> : IRepository<TInterface> where TEntity : TInterface { ... }

Entonces la inyección se puede escribir de la siguiente manera:

kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<IEntityType,EntityType>>()