Возможно (даже возможно), что я просто не полностью понимаю идею «единицы работы». В принципе, я рассматриваю это как своего рода широкую транзакцию, используемую в объектно-ориентированной среде. Запустите единицу работы, взаимодействуйте с объектами, зафиксируйте или откат. Но как это разрушается до фактических транзакций в хранилищах данных за этими объектами?Единица работы с несколькими источниками данных?
В системе с единой БД и ORM (например, NHibernate) это легко. Транзакция может поддерживаться через ORM. Но как насчет системы, в которой пользовательские модели домена скрывают многие несопоставимые источники данных? И не все эти источники данных являются реляционными базами данных? (Здесь много сделано в файловой системе.)
В настоящее время я придерживаюсь идеи, что «вы просто не можете поддерживать транзакцию через базу данных SQL2005, базу данных SQL2000, базу данных DB2 и файловая система все в одной и той же «атомной» бизнес-операции ». Так что на данный момент разработчики в команде (которые обычно работают независимо друг от друга) несут ответственность за ведение транзакций вручную в коде. Каждая БД может иметь на ней правильные транзакции, но бизнес-операция в целом проверяется вручную и балансирует каждый важный шаг на пути.
Однако с возрастающей сложностью в области и стандартным оборотом разработчиков этот подход будет становиться все более сложным и подверженным ошибкам с течением времени.
Есть ли у кого-нибудь какие-либо советы или примеры того, как лучше всего разрешить такой домен, или как он был ранее рассмотрен? Фактический «домен» в этом случае все еще очень в зачаточном состоянии, развиваясь как прототип в один день, расширяя и потребляя/заменяя большую экосистему разрозненных устаревших приложений. Таким образом, есть много возможностей для перепроектирования и повторного факторинга.
Для справки, 10 000-футовый взгляд на дизайн, к которому я в настоящее время нацелен, - это большая коллекция небольших, как можно глухих, клиентских приложений, вызывающих центральное обслуживание на основе сообщений. Услуга - это вход в «ядро домена» и может рассматриваться как одно большое приложение в стиле MVC. Запросы принимаются к сервису (так же, как «действия»), которые собираются обработчиками (подобно «контроллерам»). Там идет процедура. Они взаимодействуют с моделями, которые содержат все бизнес-правила. Модели публикуют события, в которых слушатели («службы», эта часть все еще облачно в дизайне и могут быть улучшены) выбирают и обрабатывают, взаимодействуя с репозиториями (база данных x, база данных y, файловая система, электронная почта, любой внешний ресурс). Соответственно все инъекции в зависимости от употребления алкоголя.
Извините за все многословие :) Но если у кого-нибудь есть какие-либо советы, я бы хотел его услышать. Даже (особенно), если этот совет «ваш дизайн плох, попробуйте это вместо этого ...» Спасибо!
Вы заглянули в Координатор распределенных транзакций? http://msdn.microsoft.com/en-us/library/ms684146(VS.85).aspx –
@Michael - Мне повезло с использованием TransactionScope/MSDTC с решениями SqlServer. Возможно, более сложным будет использование файловой системы и других СУБД. OP говорит о координации работы над различными двигателями db, поэтому я не предлагаю MSDTC в качестве ответа. –