如何在Ninject中绑定Generic类型的接口

时间:2012-04-20 09:33:41

标签: c# generics dependency-injection ninject generic-interface

我对Ninject很新,当我开始实现通用存储库模式时,我发现自己陷入困境。我想将依赖 IRepository< IEntityType> 绑定到类 ConcreteRepository< EntityType> ,其中ConcreteRepository< T>实现IRepository< T>和EntityType实现IEntityType。我试过这个:

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

...但是Ninject不会接受它,因为它不知道或不关心EntityType实现IEntityType。我怎样才能绑定这种依赖?

更新

这是我得到的错误:

  

错误3类型'ICM.Dependency.Repository.ConcreteRepository'不能在泛型类型或方法'Ninject.Syntax.IBindingToSyntax.To()'中用作类型参数'TImplementation'。 “ConcreteRepository&lt; EntityType&gt;”没有隐式引用转换到'IRepository&lt; IEntityType&gt;'。

我仍然不太明白为什么我的绑定不起作用,但显然我在那里错误地使用泛型。因此,该解决方案与NInject无关。我结束了指定ConcreteRepository以显式连接IEntityType和TEntityType:

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

然后注射可以写成如下:

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

1 个答案:

答案 0 :(得分:42)

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

如果你想在这里看看我的那个:http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html我有绑定的例子

编辑:

您得到的错误是说您的具体存储库不是您要绑定的通用存储库的实例,即您需要执行此操作

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

不是

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