McG*_*gle 21 c# generics dependency-injection ninject generic-interface
我是Ninject的新手,在我实现通用存储库模式时发现自己陷入困境.我想将依赖关系IRepository <IEntityType>绑定到类ConcreteRepository <EntityType>,其中ConcreteRepository <T>实现IRepository <T>,EntityType实现IEntityType.我试过这个:
kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<EntityType>>();
Run Code Online (Sandbox Code Playgroud)
...但是Ninject不会接受它,因为它不知道或不关心EntityType实现IEntityType.我怎样才能绑定这种依赖?
UPDATE
这是我得到的错误:
错误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 { ... }
Run Code Online (Sandbox Code Playgroud)
然后注射可写如下:
kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<IEntityType,EntityType>>()
Run Code Online (Sandbox Code Playgroud)
Not*_*ple 43
kernel.Bind(typeof(IRepository<>)).To(typeof(SimpleRepository<>));
Run Code Online (Sandbox Code Playgroud)
如果你想在这里看看我的那个:http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html我有绑定的例子
编辑:
您得到的错误是说您的具体存储库不是您要绑定到的通用存储库的实例,即您需要执行此操作
public class ConcreteRepository<ConcreteEntity> : IRepository<IEntity>{}
Run Code Online (Sandbox Code Playgroud)
不
public class ConcreteRepository<ConcreteEntity> : IRepository<ConcreteEntity>{}
Run Code Online (Sandbox Code Playgroud)