22

我对 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>>()
4

1 回答 1

46
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>{}
于 2012-04-20T09:37:42.757 回答