如何绑定在Ninject通用型接口(How to bind Generic-type interfa

2019-06-23 19:09发布

我是相当新的Ninject,发现自己绊倒,当我来到了实现一个通用的存储库模式。 我想的依赖性IRepository <IEntityType>结合于类ConcreteRepository <的EntityType>其中ConcreteRepository <T>实现IRepository <T>和的EntityType实现IEntityType。 我尝试这样做:

kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<EntityType>>();

......但Ninject不会采取,因为它不知道或关心的EntityType实现IEntityType。 我该如何去结合这种依赖?

UPDATE

这是我得到的错误:

错误3类型“ICM.Dependency.Repository.ConcreteRepository”不能在通用类型或方法“Ninject.Syntax.IBindingToSyntax.To()”被用作类型参数“TImplementation”。 存在从 'ConcreteRepository <的EntityType>' 到 'IRepository <IEntityType>' 没有隐式引用转换。

我还是不太明白,为什么我绑定不工作,但显然我使用泛型错误那里。 这样的解决方案并没有真正涉及到NInject。 我结束指定ConcreteRepository明确与TEntityType连接IEntityType:

public class ConcreteRepository<TInterface, TEntity> : IRepository<TInterface> where TEntity : TInterface { ... }

那么注射可以写成如下:

kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<IEntityType,EntityType>>()

Answer 1:

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


文章来源: How to bind Generic-type interfaces in Ninject