Я работаю над ASP.NET MVC 4
проектом с нуля. Я решил начать с уровня доступа к данным, используя Entity Framework 5
и Code First
рабочий процесс. Компания, с которой я работал, использовала очень хорошую реализацию (по-моему) Repository pattern
, включая репозитории, службы, абстрактную фабрику для хранилищ и услуг и Unity
для DI
. Я попытался его переделать, но это слишком сложно для меня и будет стоить мне много времени, чтобы воспроизвести то, что я там использовал, поэтому я решил провести некоторое исследование и пойти с чем-то более легким.GenericRepository и настройка UnitOfWork
Поэтому я решил использовать GenericRepository
и UnitOfWork
- вдали от первоначального плана, но это была реализация, которая показывалась в большинстве моих поисков. Поэтому я сделал очень базовую реализацию (до такой степени, что я уверен, что знаю, что происходит, может быть, даже ниже моих способностей, чтобы понять), и на самом деле я думаю, что для этого точного проекта это может быть достаточно, но я хочу, чтобы иметь возможность вызывать дополнительные пользовательские методы для разных объектов.
Я думаю, что это сильно зависит от идеи общего репозитория, но если я попытаюсь пойти с какой-то другой реализацией, она будет экспоненциально сложнее, поэтому я задаюсь вопросом, есть ли способ добавить это в мою реализацию, не причиняя слишком большого вреда идея общего репозитория.
То, что я в настоящее время является GenericRepository
класс:
public class GenericRepository<TEntity> where TEntity : class
{
internal DBContext context;
internal DbSet<TEntity> dbSet;
public GenericRepository(DBContext context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
public virtual IEnumerable<TEntity> Get()
{
IQueryable<TEntity> query = dbSet;
return query.ToList();
}
//just the standard implementation
и мой UnitOfWork
класс:
public class UnitOfWork : IDisposable
{
private DBContext context = new DBContext();
private CustomerRepository customerRepository;
public CustomerRepository CustomerRepository
{
get
{
if (this.customerRepository == null)
this.customerRepository = new CustomerRepository(context);
return customerRepository;
}
}
private GenericRepository<Order> orderRepository;
public GenericRepository<Order> orderRepository
{
get
{
Так как вы можете видеть, что мой Order
объект с помощью GenericRepository
, но я сделал тестовый класс CustomerRepository
для моего Customer
объекта.
Сейчас этот класс CustomerRepository
выглядит следующим образом:
public class CustomerRepository : GenericRepository<Customer>
{
public CustomerRepository(DBContext context) : base(context) { }
}
и идея заключается в том, чтобы добавить методы, которые явно для Customer
сущности здесь. Я не уверен, что это правильно, особенно так, как я называю конструктор. Однако каков естественный способ добавления этих конкретных методов для разных объектов? Я не против даже сделать шаг назад, чтобы реализовать его лучше, но я не хочу бросать его, потому что я пытался, и в настоящий момент вся концепция слишком сложна для меня, и я хочу быть уверенным, что я понимаю вещи что я использую в своем коде.
Вы должны посмотреть http://hwyfwk.com/Highway.Data/index.html – Kit