如何在 Ninject 中绑定泛型接口



我对 Ninject 相当陌生,当我开始实现通用存储库模式时,我发现自己磕磕绊绊。 我想将依赖项 IRepository绑定到类 ConcreteRepository其中 ConcreteRepository 实现 IRepository 和 EntityType 实现 IEntityType。 我试过这个:

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>>()
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>{}

相关内容

  • 没有找到相关文章

最新更新