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