Unity - текущий тип является интерфейсом и не может быть создан. Общий репозиторий DI

У меня есть общий репозиторий:

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

И поняла класс:

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

И у меня есть UserRepository с интерфейсом:

public interface IUserRepository : IRepository<UserRepository>
{

}

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

    }
}    

И я использую BaseController, чтобы получить Identity currentUser в любом контроллере, расширенном от Base:

BaseController:

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

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

    //Initialize
}

И HomeController:

public class HomeController : BaseController
{
    protected readonly IUserRepository userRepository;

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

    //actions
}

Я использую Unity IoC, и мой UnityConfig.cs выглядит так:

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

При запуске я получаю сообщение об ошибке:

Текущий тип, ProjectName.Data.Repository.IUserRepository, является интерфейсом и не может быть создан. Вам не хватает отображения типов?

Я думаю, что моя проблема заключается в неправильной регистрации типа, но я уже сломал голову об этом...

2 ответа

Решение

Похоже, мне нужно сопоставление между IUserRepository а также UserRepository, например:

container.RegisterType<IUserRepository, UserRepository>();

IUserRepository нужен HomeController так что это должно быть зарегистрировано внутри Ioc. Во время разрешения HomeController Ioc попытается решить IUserRepository который не существует в Ioc. Попробуйте изменить:

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

чтобы:

container.RegisterType<IUserRepository, UserRepository>()
Другие вопросы по тегам