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