После прочтения большого количества статей я до сих пор не уверен в отношении ответственности шаблона Unit of Work при взаимодействии с репозиториями.
Хранилища несут ответственность за загрузку и сохранение агрегированных корневых объектов, поэтому рассмотрим следующий пример кода:
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);
}
Код Commit Work Commit затем построил бы все необходимые SQL, чтобы отобразить объект обратно в БД?
Вопрос 2)
Если я добавлю агрегатный корень в Единицу работы, это единица работы, ответственная за сохранение корня и его дочерних элементов, или должна быть методом сохранения репозитория, добавить измененные объекты в Единицу работы? например
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();
}
Спасибо,
Джеймс