Раньше я проектировал свое приложение на основе анемичной доменной модели, поэтому у меня было много объектов репозитория, которые были внедрены в большой, толстый, поддерживающий транзакции уровень обслуживания. Этот шаблон называется скриптом транзакции. Это не считается хорошей практикой, поскольку приводит к процедурному коду, поэтому я хотел перейти к разработке, управляемой доменом.
Прочитав пару статей в Интернете, прослушав выступление Криса Ричардсона о «Парли» и прочитав DDD-главы «POJO в действии», я думаю, что получил общую картину.
Проблема в том, что я не знаю, как организовать транзакции в моем приложении. Чис Ричардсон в своей книге утверждает:
Уровень представления обрабатывает HTTP-запросы из браузера пользователя, вызывая
модель предметной области прямо или косвенно через фасад, который, как я
в предыдущей главе описывается либо POJO, либо EJB.
Пока хорошо, но Срини Пенчикала в статье InfoQ утверждает:
Некоторые разработчики предпочитают управлять транзакциями в классах DAO, что является плохим дизайном. Это приводит к слишком детальному управлению транзакциями, что не дает гибкости управления случаями использования, когда транзакции охватывают несколько объектов домена. Классы обслуживания должны обрабатывать транзакции; таким образом, даже если транзакция охватывает несколько объектов домена, класс обслуживания может управлять транзакцией, поскольку в большинстве случаев класс обслуживания обрабатывает поток управления.
Хорошо, поэтому, если я правильно понимаю, классы репозитория не должны быть транзакционными, уровень обслуживания (который теперь намного тоньше) является транзакционным (как это было в шаблоне сценария транзакции). Но что, если доменные объекты вызываются непосредственно на уровне представления? Означает ли это, что мой объект домена должен иметь транзакционное поведение? И как реализовать это в среде Spring или EJB?
Это кажется мне странным, поэтому я был бы рад, если бы кто-нибудь это прояснил. Спасибо.