2016-12-13 12 views
0

У меня есть общий репозиторий: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 получить мой идентификатор 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 
} 

Я использую единство 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?

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

ответ

1

смотрит на меня, как вам нужно отображение между IUserRepository и UserRepository. .: например

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

Спасибо, это помогло, но я получил NullRefernceException на 'dbset = _context.Set ()' 'после общественного UserRepository (IDatabaseFactory databaseFactory): base (databaseFactory) ' Я думаю, мне нужно инициализировать IDatabaseFactory при инициализации UserRepository. Возможно ли это при регистрации типа, или мне нужно сделать это в другом месте? – alexeym

+0

Кажется, у вас есть ошибка в коде. Конструктор 'BaseRepository' должен использовать свойство' DataContext' вместо поля '_context'. – Johnny

0

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

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

к:

container.RegisterType<IUserRepository, UserRepository>() 
+0

Спасибо, это помогло, кстати у меня другая ошибка .. – alexeym

 Смежные вопросы

  • Нет связанных вопросов^_^