Unity - 当前类型是接口,无法构造。通用存储库 DI

Unity - The current type is an interface and cannot be constructed. Generic repository 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);
}

并实现了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..
}

我有 UserRepository 接口:

public interface IUserRepository : IRepository<UserRepository>
{

}

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

    }
}    

我正在使用 BaseController 在从 Base 扩展的任何控制器中获取我的身份 currentUser:

基础控制器

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

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

    //Initialize
}

家庭控制器

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

在 运行,我收到错误:

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

我认为我的问题是错误的类型注册,但我已经为此崩溃了...

在我看来,您需要 IUserRepositoryUserRepository 之间的映射。 例如:

container.RegisterType<IUserRepository, UserRepository>();

IUserRepositoryHomeController 所需要的,所以它应该在 Ioc 中注册。在 HomeController 的解析过程中,Ioc 将尝试解析 Ioc 中不存在的 IUserRepository。尝试改变:

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

至:

container.RegisterType<IUserRepository, UserRepository>()