我对 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<EntityType>”到“IRepository<IEntityType>”的隐式引用转换。
解决方案
我仍然不太明白为什么我的绑定不起作用,但显然我在那里错误地使用了泛型。因此,该解决方案与 NInject 并不真正相关。我结束了指定 ConcreteRepository 以将 IEntityType 与 TEntityType 显式连接:
public class ConcreteRepository<TInterface, TEntity> : IRepository<TInterface> where TEntity : TInterface { ... }
那么注入可以写成如下:
kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<IEntityType,EntityType>>()