1
votes

I have generic repository:

public interface IRepository<T> where T : class
{
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    void Delete(Expression<Func<T, bool>> where);
    T GetById(long id);
    T GetById(string id);
    T Get(Expression<Func<T, bool>> where);
    IEnumerable<T> GetAll();
    IEnumerable<T> GetMany(Expression<Func<T, bool>> where);
}

And realized class:

public abstract class BaseRepository<T> where T : class 
{
    private ApplicationDbContext _context;
    private readonly IDbSet<T> dbset;

    protected BaseRepository(IDatabaseFactory databaseFactory)
    {
        DatabaseFactory = databaseFactory;
        dbset = _context.Set<T>();
    }

    protected IDatabaseFactory DatabaseFactory
    {
        get;
        private set;
    }

    protected ApplicationDbContext DataContext
    {
        get { return _context ?? (_context = DatabaseFactory.Get()); }
    }

    //methods below..
}

And I have UserRepository with interface:

public interface IUserRepository : IRepository<UserRepository>
{

}

public class UserRepository : BaseRepository<UserRepository>, IUserRepository
{
    public UserRepository(IDatabaseFactory databaseFactory) : base(databaseFactory)
    {

    }
}    

And I'm using BaseController to get my Identity currentUser in any controller extended from Base:

BaseController :

public class BaseController : Controller
{
    protected readonly IUserRepository userRepository;
    public UserAccountModel currentUser { get; private set; }

    public BaseController(IUserRepository UserRepository)
    {
        this.userRepository = UserRepository;
    }

    //Initialize
}

And HomeController :

public class HomeController : BaseController
{
    protected readonly IUserRepository userRepository;

    public HomeController(IUserRepository UserRepository) : base(UserRepository)
    {
        this.userRepository = UserRepository;
    }

    //actions
}

I'm using Unity IoC, and my UnityConfig.cs looks like this:

private static void RegisterTypes(IUnityContainer container)
{
    container.RegisterType<IUnitOfWork, UnitOfWork>();
    container.RegisterType<IDatabaseFactory, DatabaseFactory>();
    container.RegisterType<ApplicationDbContext>();
    container.RegisterType<ApplicationSignInManager>();
    container.RegisterType<ApplicationUserManager>();

    container.RegisterType<IAuthenticationManager>(
            new InjectionFactory(c => HttpContext.Current.GetOwinContext().Authentication));

    container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(
        new InjectionConstructor(typeof(ApplicationDbContext)));

    container.RegisterType(typeof(IRepository<>), typeof(BaseRepository<UserRepository>));
}

On run, I'm getting error:

The current type, ProjectName.Data.Repository.IUserRepository, is an interface and cannot be constructed. Are you missing a type mapping?

I think my problem is wrong type registration, but I'm already broke my head on it...

2

2 Answers

1
votes

Looks to me like you need a mapping between IUserRepository and UserRepository. e.g.:

container.RegisterType<IUserRepository, UserRepository>();
0
votes

The IUserRepository is needed by HomeController so it should be registered inside the Ioc. During the resolution of the HomeController Ioc will try to resolve IUserRepository which does not exist within Ioc. Try to change:

container.RegisterType(typeof(IRepository<>), typeof(BaseRepository<UserRepository>));

to:

container.RegisterType<IUserRepository, UserRepository>()