Домен управляемый дизайн и транзакции в среде Spring

Я раньше разрабатывал мое приложение на основе анемичной модели предметной области, таким образом, у меня были многие объект репозитария, которые были введены к большому, осведомленному о транзакции уровню служб. Этот шаблон называют сценарием Транзакции. Это не рассмотрело хорошую практику, так как это приводит к процессуальному кодексу, таким образом, я хотел продвинуться к домену управляемый дизайн.

После чтения нескольких статей о сети, слушание разговора Chris Richardson о Переговорах и чтения главы DDD POJOs в Действии, я думаю, что получил большое изображение.

Проблема, который я не знаю, как организовать транзакции в моем приложении. Хи Richardson в его книжных состояниях:

Уровень представления обрабатывает Запросы HTTP от браузера пользователя путем называния модели предметной области любым прямо или косвенно через фасад, который, поскольку я описал в предыдущей главе, или POJO или EJB.

Хороший до сих пор, но Srini Penchikala на состояниях статьи InfoQ:

Некоторые разработчики предпочитают управлять транзакциями в классах ДАО, который является плохим дизайном. Это приводит к слишком мелкомодульному управлению транзакциями, которое не дает гибкость управления вариантами использования, где транзакции охватывают несколько объектов области. Классы обслуживания должны обработать транзакции; этот путь, даже если транзакция охватывает несколько объектов области, класс обслуживания, может управлять транзакцией с тех пор в большинстве вариантов использования, Класс обслуживания обрабатывает поток управления.

Хорошо, поэтому если я понимаю это правильно, классы репозитория не должны быть транзакционным, уровнем служб (который является теперь намного более тонким), является транзакционным (поскольку он раньше был в шаблоне сценария Транзакции). Но что, если объекты области называет уровень представления непосредственно? Это означает, что мой объект области должен иметь транзакционное поведение? И как реализовать его в Spring или среде EJB?

Это кажется довольно странным мне, таким образом, я был бы счастлив, если кто-то разъяснит это.Спасибо.

19
задан Bozho 19 January 2010 в 13:12
поделиться

3 ответа

Благодаря вашим ответам я только что узнал, как я могу сделать это путь я предполагал:

echo $object->{'variable$WithDollar'}; // works !

Я был уверен, что пробовал все возможные комбинации до этого.

-121--2655448-

Вы можете свернуть весь код в отдельный метод и вызвать его из Main ():

static void Main(string[] args)
{
  DoSomething();
  TerminateThread(); // Thread.Stop() code goes here
}

static void DoSomething()
{
   /// some code
   return;

   // some code
   return;

   //// etc
}
-121--4817849-

Мой личный подход к применению DDD с Spring и Hibernate до сих пор состоит в том, чтобы иметь уровень транзакционного обслуживания без статуса и получить доступ к Таким путь я делаю это, модель домена вообще не знает о транзакциях, которые обрабатываются полностью службами.

Существует пример приложения , который может оказаться полезным для просмотра. Похоже, Эрик Эванс участвовал в его создании.

10
ответ дан 30 November 2019 в 04:59
поделиться

См. этот чрезвычайно полезный пост в блоге. В нем объясняется, как достичь плавного DDD, не теряя при этом возможностей Spring и JPA. Он сосредоточен вокруг аннотации @Configurable.

Мое мнение по этим вопросам немного непопулярно. Анемичная модель данных на самом деле не является неправильной. Вместо одного объекта с данными+операциями, у вас есть два объекта - один с данными, другой с операциями. Вы можете рассматривать их как один объект - т.е. удовлетворяющий DDD, но для удобства использования они физически разделены. Логически они одинаковы.

Да, это нарушает инкапсуляцию, но это не заставляет вас использовать некую "магию" (aop + java agent) для достижения своих целей.

Что касается транзакций - существует нечто, называемое Transaction propagation. Spring поддерживает ее с помощью @Transactional(propagation=Propagation.REQUIRED). См. это, пункт 9.5.7. Если вы хотите, чтобы ваши транзакции охватывали несколько методов (нескольких объектов), вы можете изменить атрибут propagation соответствующим образом.

Вы также можете использовать @Transactional в вашем сервисном уровне, где это уместно, но это может привести к появлению большого количества котельных сервисных классов в случаях, когда вы хотите использовать простые, однократные транзакции.пошаговые операции типа "сохранить".

7
ответ дан 30 November 2019 в 04:59
поделиться

Я думаю, что один из простых способов начать работу с DDD и Spring и получить хорошие примеры того, как работать с транзакциями, - это посмотреть на одно из примеров приложений, поставляемых с Spring Roo . Roo производит код, который следует принципам DDD. Он сильно зависит от AspectJ. Я подозреваю, что он был реализован на основе идей, выдвинутых (еще в 2006 году) одним из тяжеловесов SpringSource, Рамнивасом Ладдадом в этом докладе .

1
ответ дан 30 November 2019 в 04:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: