#design-patterns #data-access-layer #unit-of-work
#шаблоны проектирования #уровень доступа к данным #единица работы
Вопрос:
Интернет полон информации о UnitOfWork
шаблоне; даже ЭТО не исключение.
Я все еще чего-то не понимаю в этом. В моем понимании UnitOfWork = Transaction in DB
. Вот и все; ни больше, ни меньше.
Это правильно?
Мое замешательство связано с тем, как оно реализовано в разных ORM
s. NHibernate
используется ISession
не только Transaction
для . Dapper
оставляет все на ваше усмотрение.
Мой вопрос здесь касается только шаблона проектирования без учета какой ORM
-либо технологии или.
Если это больше, чем просто Transaction
, пожалуйста, объясните, как.
Редактировать 1
Ссылка на эту ссылку, как предложено в ответе @David Osborne.
Единица работы отслеживает все, что вы делаете во время бизнес-транзакции, которая может повлиять на базу данных. Когда вы закончите, программа определит все, что нужно сделать, чтобы изменить базу данных в результате вашей работы.
Так что это означает UnitOfWork
, что это DBTransaction
и многое другое.
Ниже приведены его дополнительные обязанности: —
-
Поддерживайте состояние того, что вы изменили, вставили, удалили в этом сеансе работы.
-
На основе этого состояния измените базу данных по завершении работы.
Хотя в приведенной выше цитате это явно не указано, но оно также может управлять пакетной обработкой запросов.
Правильно ли я понимаю сейчас?
Комментарии:
1. Я бы сказал, что это зависит от вашего варианта использования и того, каков ваш UnitOfWork (он же. CreateCustomer, MakeBooking, CreateInvoice, …) должен делать…. Я использую его таким образом с одной транскацией, но единицей работы также может быть более одной транскации. Если вас больше одного, вам нужно контролировать откаты / возврат преобразований.
Ответ №1:
A UnitOfWork
— это бизнес-транзакция. Не обязательно техническая транзакция (транзакция БД), но часто привязана к техническим транзакциям.
В шаблонах корпоративных приложений это определяется как
Поддерживает список объектов, на которые влияет бизнес-транзакция, и координирует внесение изменений и решение проблем параллелизма.
Он не определяет ни способ записи изменений, ни тип хранилища.
Приложение может записывать изменения в
- база данных с использованием SQL
- файловая система, использующая потоки
- служба сохранения с использованием http-запросов
- распределенный кэш или даже хранилище в памяти с использованием вызовов методов
A UnitOfWork
(бизнес-транзакция) собирает изменения в бизнес-объектах и гарантирует, что другие бизнес-транзакции будут видеть только действительные бизнес-объекты.
Например, когда ваше приложение выполняет вариант использования, оно изменяет бизнес-объекты. Если две бизнес-транзакции (обычно варианты использования) выполняются параллельно, ваше приложение должно позаботиться об изменениях, которые выполняет каждая бизнес-транзакция, и о времени, когда другие бизнес-транзакции их увидят.
Технически это часто делается с использованием транзакции db. Таким образом, единицей работы обычно является транзакция БД.
Приложения, которые используют ORM-фреймворки для обработки сохраняемости, обычно имеют отношение «один к одному» между единицей работы и транзакцией БД. Таким образом, разница между единицей работы и транзакцией БД обычно не имеет значения для разработчиков.
Ответ №2:
Это происходит, AFAIK, из-за необходимости использования инструментов ORM для отслеживания состояния [сохраняемости] объектов во время логической / бизнес-транзакции.
То, как единица работы управляет этим, и ее взаимосвязь с базовой технологией хранения и хранящимися объектами, является деталью реализации.
Транзакция базы данных с несколькими операторами SQL между ними, возможно, также является единицей работы. Однако ключевое отличие, я полагаю, заключается в том, что единица работы, определенная в шаблоне, абстрагировала этот уровень детализации до уровня объекта.
Комментарии:
1. Это возможно. Опять же, это зависит и зависит от реализации. Я знаю, что NHibernate будет выполнять пакетные операции, когда условия будут правильными.
2. @DavidOsborne я совершенно уверен, что это даже восходит к тому времени, когда ORM еще не было 🙂
3. Интересный момент, @guillaume31. Мой опыт работы с ним восходит только к шаблону Фаулера.