Я раньше разрабатывал мое приложение на основе анемичной модели предметной области, таким образом, у меня были многие объект репозитария, которые были введены к большому, осведомленному о транзакции уровню служб. Этот шаблон называют сценарием Транзакции. Это не рассмотрело хорошую практику, так как это приводит к процессуальному кодексу, таким образом, я хотел продвинуться к домену управляемый дизайн.
После чтения нескольких статей о сети, слушание разговора Chris Richardson о Переговорах и чтения главы DDD POJOs в Действии, я думаю, что получил большое изображение.
Проблема, который я не знаю, как организовать транзакции в моем приложении. Хи Richardson в его книжных состояниях:
Уровень представления обрабатывает Запросы HTTP от браузера пользователя путем называния модели предметной области любым прямо или косвенно через фасад, который, поскольку я описал в предыдущей главе, или POJO или EJB.
Хороший до сих пор, но Srini Penchikala на состояниях статьи InfoQ:
Некоторые разработчики предпочитают управлять транзакциями в классах ДАО, который является плохим дизайном. Это приводит к слишком мелкомодульному управлению транзакциями, которое не дает гибкость управления вариантами использования, где транзакции охватывают несколько объектов области. Классы обслуживания должны обработать транзакции; этот путь, даже если транзакция охватывает несколько объектов области, класс обслуживания, может управлять транзакцией с тех пор в большинстве вариантов использования, Класс обслуживания обрабатывает поток управления.
Хорошо, поэтому если я понимаю это правильно, классы репозитория не должны быть транзакционным, уровнем служб (который является теперь намного более тонким), является транзакционным (поскольку он раньше был в шаблоне сценария Транзакции). Но что, если объекты области называет уровень представления непосредственно? Это означает, что мой объект области должен иметь транзакционное поведение? И как реализовать его в Spring или среде EJB?
Это кажется довольно странным мне, таким образом, я был бы счастлив, если кто-то разъяснит это.Спасибо.
Благодаря вашим ответам я только что узнал, как я могу сделать это путь я предполагал:
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 до сих пор состоит в том, чтобы иметь уровень транзакционного обслуживания без статуса и получить доступ к Таким путь я делаю это, модель домена вообще не знает о транзакциях, которые обрабатываются полностью службами.
Существует пример приложения , который может оказаться полезным для просмотра. Похоже, Эрик Эванс участвовал в его создании.
См. этот чрезвычайно полезный пост в блоге. В нем объясняется, как достичь плавного DDD, не теряя при этом возможностей Spring и JPA. Он сосредоточен вокруг аннотации @Configurable
.
Мое мнение по этим вопросам немного непопулярно. Анемичная модель данных на самом деле не является неправильной. Вместо одного объекта с данными+операциями, у вас есть два объекта - один с данными, другой с операциями. Вы можете рассматривать их как один объект - т.е. удовлетворяющий DDD, но для удобства использования они физически разделены. Логически они одинаковы.
Да, это нарушает инкапсуляцию, но это не заставляет вас использовать некую "магию" (aop + java agent) для достижения своих целей.
Что касается транзакций - существует нечто, называемое Transaction propagation. Spring поддерживает ее с помощью @Transactional(propagation=Propagation.REQUIRED)
.
См. это, пункт 9.5.7. Если вы хотите, чтобы ваши транзакции охватывали несколько методов (нескольких объектов), вы можете изменить атрибут propagation соответствующим образом.
Вы также можете использовать @Transactional
в вашем сервисном уровне, где это уместно, но это может привести к появлению большого количества котельных сервисных классов в случаях, когда вы хотите использовать простые, однократные транзакции.пошаговые операции типа "сохранить".
Я думаю, что один из простых способов начать работу с DDD и Spring и получить хорошие примеры того, как работать с транзакциями, - это посмотреть на одно из примеров приложений, поставляемых с Spring Roo . Roo производит код, который следует принципам DDD. Он сильно зависит от AspectJ. Я подозреваю, что он был реализован на основе идей, выдвинутых (еще в 2006 году) одним из тяжеловесов SpringSource, Рамнивасом Ладдадом в этом докладе .