Search code examples
c#asp.netgenericsdependency-injectionninject

How do I bind interface to class using generics with Ninject?


I created a generic Interface and a generic repo. I'm trying to utilize these generics with my existing architecture to improve and simplify my dependency injection implementation.

The binding works without the generics implementation. I can't seem to find where I'm going wrong.

Below is how I'm trying to implement these generics with Ninject.

There error that I receive is:

///Error message: Unable to cast object of type 'DataRepository' to type 'IDataRepository'.

Here is the generic repo and interface

//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...

Here I've created repo and interface that uses the generics

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

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

In the static class NinjectWebCommon under ../App_Start I'm binding the classes in the RegisterServices(IKernel kernel) method. I've tried several ways of binding but I continue to receive the "Unable to cast object type..." error.

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

Does anyone see anything that I'm doing wrong that would cause this issue?


Solution

  • The problem is that DataRepository is not inheriting from IDataRepository.

    Something like this should be fine:

    public class DataRepository : GenericRepository<MainSearchResult>, IDataRepository
    {
        ...