Когда я начал изучать шаблон хранилища с помощью Unity несколько дней назад, у меня создалось впечатление, что основным преимуществом этого шаблона является разделение слоя данных с бизнес-слоем.Универсальное приложение шаблона хранилища
Другими словами, если есть необходимость изменить способ, как приложение хранит данные, это очень просто, поскольку только одна основная модель заботится об общении.
Это означает, что если приложение в настоящее время сохраняет данные в сериализованных XML-файлах, было бы не очень сложно изменить эту логику для подключения к базе данных.
Я нашел несколько хороших демонстраций, которые также используют слой Unit Of Work
, который казался очень удобным. Позвольте мне показать вам немного кода, который у меня есть.
public class UnitOfWork : IUnitOfWork
{
private readonly RepositoryContext _context;
public IEmployeeRepository Employees { get; set; }
public UnitOfWork(RepositoryContext context)
{
_context = context;
Employees = new EmployeeRepository(_context);
}
public int Complete()
{
return _context.SaveChanges();
}
public void Dispose()
{
_context.Dispose();
}
}
Главная Repository Контекст:
public class RepositoryContext : DbContext
{
public RepositoryContext() : base("name=RepositoryContext")
{
}
public virtual DbSet<Employee> Employees { get; set; }
public virtual DbSet<Equipment> Furniture { get; set; }
}
А вот демо EmployeeRepository:
public class EmployeeRepository:Repository<Employee>, IEmployeeRepository
{
public EmployeeRepository(RepositoryContext context) : base(context) { }
public Employee GetEmployeeByName(string sName)
{
return MyContext.Employees.FirstOrDefault(n => n.Name == sName);
}
public RepositoryContext MyContext
{
get { return Context as RepositoryContext; }
}
}
Сотрудник Repository проистекает из общего Repository
, который выглядит следующим образом:
public class Repository<T> : Interfaces.Repositories.IRepository<T> where T : class
{
protected readonly DbContext Context;
public Repository(DbContext context)
{
Context = context;
}
public void Add(T item)
{
Context.Set<T>().Add(item);
}
public IEnumerable<T> Find(Expression<Func<T, bool>> predicate)
{
return Context.Set<T>().Where(predicate);
}
public T Get(int ID)
{
return Context.Set<T>().Find(ID);
}
public IEnumerable<T> GetAll()
{
return Context.Set<T>().ToList();
}
public void Remove(T item)
{
Context.Set<T>().Remove(item);
}
}
Вот вопрос:
Насколько я понимаю, идет, мы прямо заявляя, что в наших Repository
предпологает в его конструктор DbContext
, который впоследствии используется при всех Add/Remove/Find
функций под конкретного класса.
В настоящее время эта модель взаимодействует с базой данных, но если бы я хотел (по какой-либо причине) изменить эту модель для сохранения данных в XML-файле, мне пришлось бы полностью переписать все мои классы Repository
? Или я чего-то не хватает?
Если я ошибаюсь, и это легко выполнимо, может ли кто-нибудь показать мне, как изменить код, чтобы мы сериализовали значения в XML-файлы, пожалуйста? Я пытаюсь лучше понять этот шаблон репозитория, но пока это один большой хаос для меня.
Любая помощь/предложения по этому вопросу были бы высоко оценены.
Если вы изменили способ хранения данных, может потребоваться переписать класс репозитория (это, очевидно, ожидается), но не потребитель IRepository, так как интерфейс остается прежним, независимо от того, как хранятся данные. Поэтому вам не нужно менять бизнес-классы, это то, что называется «разделение уровня данных с бизнес-уровня». –