【发布时间】:2012-05-01 21:15:31
【问题描述】:
我对 Ninject 还很陌生,当我开始实现通用存储库模式时,我发现自己陷入了困境。我想将依赖项 IRepository
kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<EntityType>>();
...但是 Ninject 不会接受,因为它不知道也不关心 EntityType 实现了 IEntityType。我该如何去绑定这个依赖呢?
更新
这是我得到的错误:
错误 3 类型“ICM.Dependency.Repository.ConcreteRepository”不能用作泛型类型或方法“Ninject.Syntax.IBindingToSyntax.To()”中的类型参数“TImplementation”。没有从“ConcreteRepository
”到“IRepository ”的隐式引用转换。
解决方案
我仍然不太明白为什么我的绑定不起作用,但显然我在那里错误地使用了泛型。因此,该解决方案与 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>上启用 ctor 依赖项 - 在这种情况下,您的 Bind 以上将是错误的。 -
@RubenBartelink 这是一个编译错误;见上面的更新。对于您的第一点 - 它没有,但如前所述 ConcreteRepository
实现了 IRepository 。也许这就是我的问题。对于第二点,我想在构造函数中使用 IRepository 以实现灵活性——存储库依赖项应该处理接口,而不是具体实体。 -
对。那么导致编译错误的
where约束是有原因的——你建议的具体组件类型根本无法转换为你Binding 的服务类型。别找了!我建议看看其他人是如何实现通用存储库模式的——你离正常实践还很远。你可以在这里的问题中解释你从这些东西中得到了什么,但我建议你应该先问自己,然后也许在这里你的类层次结构是否可以合理化。 -
@RubenBartelink 可能是这样,但我的问题不是如何实现通用存储库。这是如何将依赖项绑定到通用接口。
-
@dbaseman 你为什么要你的具体存储库采用一个具体的实体?它不能只占用你的实体接口吗?
标签: c# generics dependency-injection ninject generic-interface