ninject ioc with inherited base generic repository

时间:2014-02-22 10:43:04

标签: ioc-container ninject.web.mvc

我有一个通用的存储库,抽象和具体如下

public interface IGenericRepository<T> where T : class

public class GenericRepository<T> : IGenericRepository<T> where T : class

然后我有一个继承自此的存储库,再次抽象和具体

public interface ISkyDiveCentreRepository : IGenericRepository<DiveCentre>

public class SkyDiveCentreRepository : GenericRepository<DiveCentre>

在我的ninject配置中,我有

kernel.Bind(typeof(IGenericRepository<>)).To(typeof(GenericRepository<>));
kernel.Bind<ISkyDiveCentreRepository>().To<SkyDiveCentreRepository>();

这是我第一次尝试这样做但收到错误:

Error   2   The type 'UKSkyDiveCentres.DAL.imp.SkyDiveCentreRepository' cannot be used as type parameter 'TImplementation' in the generic type or method 'Ninject.Syntax.IBindingToSyntax<T1>.To<TImplementation>()'. There is no implicit reference conversion from 'SkyDiveCentres.DAL.imp.SkyDiveCentreRepository' to 'SkyDiveCentres.DAL.ISkyDiveCentreRepository'. C:SOMEPATH\UKSkyDiveCentres\App_Start\NinjectWebCommon.cs   56  13  SkyDiveCentres

1 个答案:

答案 0 :(得分:1)

您的SkyDiveCentreRepository继承自GenericRepository<DiveCentre>,未实现ISkyDiveCentreRepository界面。

简单明确地实施它:

public class SkyDiveCentreRepository : 
    GenericRepository<DiveCentre>, ISkyDiveCentreRepository
                               //  ^^^^^^^^^^^^^^^^^^^^^^^^ this

没有它......你不能做这样简单的事情:

ISkyDiveCentreRepository repo = new SkyDiveCentreRepository();

如果你做不到.Ninject也不能。