我对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>>()
ConcreteRepository<EntityType>
实现了IRepository<IEntityType>
吗?(通常情况下,构造函数的依赖项应该是IRepository<EntityType>
,在这种情况下,你上面的绑定是错误的。) - Ruben Bartelink