Прочитав множество статей, я все еще не уверен в ответственности шаблона Unit of Work при взаимодействии с репозиториями.
Репозитории отвечают за загрузку и сохранение корневых объектов Aggregate, поэтому рассмотрим следующий пример кода:
using(IUnitOfWork uow = container.CreateUnitOfWork())
{
Repository<ARoot> roots = container.GetRepository<ARoot>();
ARoot root = root.FindByName("ARoot");
root.Name = "ANewName";
roots.Save(root);
uow.Commit();
}
Интерфейс единицы работы будет определен следующими методами:
public interface IUnitOfWork
{
void Insert(object);
void Update(object);
void Delete(object);
void Commit();
void Rollback();
}
Предположим, что репозиторий реализован с использованием очень простого SQL Mapper, поэтому FindByName содержит некоторый прямой SQL для возврата ARoot, будет ли реализация Save выглядеть примерно так:
public void Save(T entity)
{
IUnitOfWork uow = GetUnitOfWork();
// Tell the UOW we are updating this entity
uow.Update(entity);
}
Затем код Unit Of Work Commit создаст весь необходимый SQL для сопоставления объекта обратно в БД?
Вопрос 2)
Если я добавлю совокупный корень в единицу работы, будет ли единица работы отвечать за сохранение корня и его дочерних объектов, или метод Save репозитория должен добавлять измененные объекты в единицу работы? например
public void Save(T entity)
{
IUnitOfWork uow = GetUnitOfWork();
// Tell the UOW we are updating this entity
uow.Update(entity);
uow.Update(entity.AChildObject);
}
ИЛИ... Альтернативно
Работает ли единица работы только с совокупными корнями и при фиксации вызывает методы сохранения репозитория для каждого объекта в его наборе изменений, сохраняя код сопоставления SQL для сохранения объекта в репозитории, изменяя первый пример кода на
using(IUnitOfWork uow = container.CreateUnitOfWork())
{
Repository<ARoot> roots = container.GetRepository<ARoot>();
ARoot root = root.FindByName("ARoot");
root.Name = "ANewName";
//roots.Save(root);
uow.Update(root);
// and commit
uow.Commit();
}
Спасибо,
Джеймс