Зв'язок між сховищем та підрозділом роботи


17

Я збираюся реалізовувати сховище, і я хотів би використовувати шаблон 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, а цей всередині сховища має сенс також.

Ура


Відповіді:


7

Re: "UOW відстежує елементи, які потрібно змінити, і сховище містить логіку, щоб зберегти ці зміни, але ... хто кого дзвонить?"

Ви розумієте основні обов'язки цих занять. Ви кажете, що кожна з прочитаних статей пов’язує їх між собою по-різному. Це означає, що рішення про те, хто кого дзвонить, залежить від вас.

Я б спробував накреслити проблему з точки зору "шарів", керуючись основними принципами гарного дизайну програмного забезпечення, такими як " Згуртованість" , " Розв'язка" , " Повторність використання" , "Тестовість" тощо.

Цитую Ерік Еванс домену Driven Design (2004) Addison Wesley, стор 69 :

Основним принципом [шаруватих архітектур] є те, що будь-який елемент шару залежить лише від інших елементів цього ж шару або від елементів шарів, що знаходяться під ним.

На мою думку, і UOW, і Repo - це два дуже різні класи, які мають чіткі, незалежні, обов'язки. Для початку я не змушував би посилатися на іншого.

Я думаю , вам потрібно трохи третій клієнт класу (тобто або controllerабо service class) , що дійсно знає «що і коли , щоб отримати» з репо і «коли» , щоб зберегти угоду. Цей клієнт сидить відносно високо в архітектурі (тому можна знати про більше класів) і може зробити деяку оркестрацію між ними.

--------------------------------

         [Client]
           /   \
----------/---- \---------------
         /       \
        V         V
[Unit Of Work]  [Repo]


--------------------------------

2

Методи найчастіше надаються інтерфейсу UOW (який зазвичай будується на заводі).

Зазвичай ви викликаєте методи в інтерфейсі UOW з класів (класів) / фасаду команд. Оскільки UOW просто відкладає IO бази даних на пізніше (щоб не допустити тривалих транзакцій або декількох викликів до бази даних, які можуть бути непотрібними), робота з UOW повинна бути на тому самому рівні, що ви зазвичай працюєте зі своєю базою даних.

Майкрософт має дуже ретельну публікацію щодо шаблону UOW:

http://msdn.microsoft.com/en-us/magazine/dd882510.aspx

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.