Я збираюся реалізовувати сховище, і я хотів би використовувати шаблон UOW, оскільки споживач сховища міг зробити кілька операцій, і я хочу зробити їх відразу.
Прочитавши кілька статей з цього питання, я все ще не розумію, як співвідносити ці два елементи, залежно від статті, яка робиться в інший спосіб.
Іноді UOW є чимось внутрішнім для сховища:
public class Repository
{
UnitOfWork _uow;
public Repository()
{
_uow = IoC.Get<UnitOfWork>();
}
public void Save(Entity e)
{
_uow.Track(e);
}
public void SubmittChanges()
{
SaveInStorage(_uow.GetChanges());
}
}
І іноді це зовнішнє:
public class Repository
{
public void Save(Entity e, UnitOfWork uow)
{
uow.Track(e);
}
public void SubmittChanges(UnitOfWork uow)
{
SaveInStorage(uow.GetChanges());
}
}
В іншому випадку - UOW, на кого посилається сховище
public class UnitOfWork
{
Repository _repository;
public UnitOfWork(Repository repository)
{
_repository = repository;
}
public void Save(Entity e)
{
this.Track(e);
}
public void SubmittChanges()
{
_repository.Save(this.GetChanges());
}
}
Як пов’язані ці два елементи? UOW відстежує елементи, які потрібно змінити, і сховище містить логіку, щоб зберегти ці зміни, але ... хто кого дзвонить? Чи має останній сенс більше?
Також, хто керує з'єднанням? Якщо в сховищі потрібно виконати кілька операцій, я думаю, що використання одного і того ж з'єднання і навіть транзакція є більш звуковим, тому, можливо, покладіть об’єкт з'єднання всередину UOW, а цей всередині сховища має сенс також.
Ура