如何使用Ninject的泛型将接口绑定到类?

时间:2016-05-02 19:26:55

标签: c# asp.net generics dependency-injection ninject

我创建了一个通用接口和一个通用的repo。我试图利用现有架构中的这些泛型来改进和简化我的依赖注入实现。

绑定在没有泛型实现的情况下工作。 我似乎无法找到我出错的地方。

以下是我尝试使用Ninject实现这些泛型的方法。

我收到的错误是:

  

///错误讯息:        无法转换类型' DataRepository'的对象输入' IDataRepository'。

这是通用的repo和接口

//generic interface
     public interface IGenericRepository<T> where T : class
    {
        IQueryable<T> GetAll();
        IQueryable<T> FindBy(Expression<Func<T, bool>> predicate);
        void Add(T entity);
        void Delete(T entity);
        void Edit(T entity);
        void Save();
    }


//generic repo
    public abstract class GenericRepository<T> : IGenericRepository<T> where T : class 
    {  
          ////removed the implementation to shorten post...

我在这里创建了使用泛型的repo和界面

//repo
    public class DataRepository : GenericRepository<IDataRepository>
    {
        public IQueryable<MainSearchResult> SearchMain(){ //.... stuff here}
    }

    //interface
    public interface IDataRepository : IGenericRepository<MainSearchResult>
    {
        IQueryable<MainSearchResult> SearchMain(){ //.... stuff here}
    }

在../App_Start下的静态类NinjectWebCommon中,我绑定了RegisterServices(IKernel kernel)方法中的类。 我尝试了几种绑定方式,但我继续收到&#34;无法投射对象类型......&#34;错误。

    private static void RegisterServices(IKernel kernel)
            {
                // current failed attempts
kernel.Bind(typeof(IGenericRepository<>)).To(typeof(GenericRepository<>));
                kernel.Bind(typeof(IDataRepository)).To(typeof(DataRepository));

                // failed attempts
                //kernel.Bind<IDataRepository>().To<GenericRepository<DataRepository>>();
                //kernel.Bind<IDataRepository>().To<GenericRepository<DataRepository>>();
            } 

有没有人看到任何导致此问题我做错的事情?

1 个答案:

答案 0 :(得分:2)

问题在于public class DataRepository : GenericRepository<MainSearchResult>, IDataRepository { ... 不是从import xml.etree.cElementTree as ET for event, element in ET.iterparse('huge.xml'): if event == 'end' and element.tag == 'ticket': #process ticket... 继承。

这样的事应该没问题:

{{1}}