За прошлую неделю или таким образом, я читал много статей и учебных руководств относительно шаблона репозитория. Много статей тесно связывает шаблон репозитория с шаблоном единицы работы. В этих статьях я обычно нахожу код подобным этому:
interface IUnitOfWork<TEntity>
{
void RegisterNew(TEntity entity);
void RegisterDirty(TEntity entity);
void RegisterDeleted(TEntity entity);
void Commit();
void Rollback();
}
interface IRepository<TKey, TEntity>
{
TEntity FindById(TKey id);
IEnumerable<TEntity> FindAll();
void Add(TEntity entity);
void Update(TEntity entity);
void Delete(TEntity entity);
}
class Repository : IRepository<int, string>
{
public Repository(IUnitOfWork<string> context)
{
this.context = context;
}
private IUnitOfWork<string> context;
public void Add(string entity)
{
context.RegisterNew(entity);
}
public void Update(string entity)
{
context.RegisterDirty(entity);
}
public void Delete(string entity)
{
context.RegisterDeleted(entity);
}
/* Entity retrieval methods */
}
Я понимаю правильно, что объект единицы работы предназначен для обработки дополнения, обновления или удаления какого-либо объекта в базовом хранилище данных (в моем случае, служба каталогов, которой я общаюсь с через LDAP)? Если это правда, разве это не должно обрабатывать извлечение никаких объектов также? Почему то, что не часть предложенного интерфейса UoW?
Репозиторий
отвечает за данные - получение, обновление и другие операции CRUD, обеспечивающие игнорирование постоянства.
A Unit Of Work
(uow), как говорит Марин Фаулер:
Поддерживает список объектов, затронутых бизнес-транзакцией, и координирует запись изменений и решение проблем параллелизма.
uow будет координировать несколько операций с объектами - он может использовать или не использовать репозитории для сохранения этих изменений.