У меня есть общий репозиторий: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?
Я думаю, что моя проблема заключается в регистрации неправильного типа, но я уже сломал голова на него ...
Спасибо, это помогло, но я получил NullRefernceException на 'dbset = _context.Set()' 'после общественного UserRepository (IDatabaseFactory databaseFactory): base (databaseFactory) ' Я думаю, мне нужно инициализировать IDatabaseFactory при инициализации UserRepository. Возможно ли это при регистрации типа, или мне нужно сделать это в другом месте? –
alexeym
Кажется, у вас есть ошибка в коде. Конструктор 'BaseRepository' должен использовать свойство' DataContext' вместо поля '_context'. – Johnny