DDD с Grails

Я не могу найти информацию о выполнении Domain Driven Design (DDD) с Grails.

Я ищу любые лучшие практики, опытные заметки или даже проекты с открытым исходным кодом, которые являются хорошими примерами DDD с Grails.

Ответы

Ответ 1

Grails - это платформа par-excellence для реализации приложений в стиле Driven Design. В центре подхода Grails находятся классы домена, которые управляют всем процессом разработки. Как вы, наверное, догадываетесь, выбор доменного домена в Grails - это не просто совпадение.

Вы начинаете с определения своих классов доменов, а затем можете использовать Grails для выполнения всех тяжелых операций при сохранении и генерации графического интерфейса. Стоит отметить, что когда книга DDD была написана, это было до того, как были созданы Grails или другие подобные структуры, поэтому многие проблемы, затронутые в книге, связаны с проблемами, которые были решены или значительно сокращены рамками.

Некоторые концепции DDD, разрешенные Grails

Я использую описание шаблона DDD для адресации различных элементов DDD. (Котировки выделены курсивом в тексте ниже).

Модель домена

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

Объекты

"Когда объект отличается своей идентичностью, а не его атрибутами, сделайте это первичным для своего определения в модели"

Это классы домена в Grails. Они приходят с упорством, уже разрешенным через GORM. Модель может быть точно настроена с использованием GORM DSL. Взгляните на свойство hasOne vs. ownTo. Его можно использовать для определения жизненного цикла объектов и их отношений. attribTo приведет к каскадным ударам связанным объектам, а другим - нет. Итак, если у вас есть объект Car, вы можете сказать, что Motor "принадлежит" автомобилю, и в этом случае Car является агрегатным корнем и двигателем агрегатом. Обратите внимание, что я говорю здесь о соотношении жизненного цикла между сущностями, а не о сохранении.

Объекты значения

"Когда вы заботитесь только об атрибутах элемента модели, классифицируйте его как ОБЪЕКТ VALUE. Сделайте это, чтобы выразить смысл атрибутов, которые он передает, и дайте им связанные функции. Относитесь к объекту VALUE как непреложному. это любая личность..."

В Grails вы можете использовать "embedded" свойство в поле GORM для управления объектом значения. Объект Value может быть доступен только через объект, к которому он принадлежит, не имеет собственного идентификатора и сопоставляется с той же таблицей, что и объект, к которому он принадлежит. Groovy также поддерживает @Неизбежно аннотация, но я не уверен, как она играет с Grails.

Услуги

"Когда существенный процесс или преобразование в домене не является естественной ответственностью объекта ENTITY или VALUE, добавьте операцию в модель как автономный интерфейс, объявленный как СЕРВИС. Сделайте SERVICE без гражданства".

Так же, как сущности, службы поддерживаются в Grails. Вы размещаете свою службу Grails внутри каталога сервисов в проекте Grails. Услуги поставляются со следующей версией:

  • Инъекция зависимостей
  • Поддержка транзакций
  • Простой механизм для предоставления услуг в виде веб-сервисов, так что к ним можно получить доступ удаленно.

Модули

"Выберите MODULES, которые расскажут историю системы и содержат сплоченный набор понятий".

Grails plug-in механизм предоставляет это и многое другое: очень простой способ установки и создания плагинов, определяет, как приложение может переопределять плагины и т.д..

Заполнители

"Скопируйте объекты ENVTIES и VALUE в AGGREGATES и определите границы вокруг каждого. Выберите один ENTITY, чтобы быть корнем каждого AGGREGATE, и контролируйте весь доступ к объектам внутри границы через корень. Разрешить внешним объектам удерживать ссылки на только корень."

Я уже упомянул некоторые механизмы управления жизненным циклом. Вы можете использовать службы Grails Services и механизм контроля доступа к языку для обеспечения контроля доступа. У вас может быть служба Grails, играющая роль репозитория DDD, который разрешает доступ только к Aggregate Root. Хотя контроллеры в Grails могут напрямую обращаться к операциям GORM на Entities, я бы утвердил, что для лучшего многоуровневого дизайна контроллерам необходимо вводить услуги, которые делегируются операциям GORM Active Record.

Заводы

"Сменить ответственность за создание экземпляров сложных объектов и AGGREGATES на отдельный объект, который сам по себе не может нести ответственность в модели домена, но все еще является частью дизайна домена."

Groovy builders - отличная альтернатива для построения сложных объектов через богатый DSL. В DDD заводы более свободны и не переходят непосредственно к GoF Аннотация Factory или Factory Метод. Groovy сборщики - это реализация DSL шаблона GoF Builder.

Хранилища

"Для каждого типа объекта, который нуждается в глобальном доступе, создайте объект, который может обеспечить иллюзию коллекции в памяти всех объектов такого типа. Настройте доступ через общеизвестный глобальный интерфейс. и удалять объекты, которые будут инкапсулировать фактическую вставку или удаление данных в хранилище данных. Предоставить методы, которые выбирают объекты на основе некоторых критериев и возвращать полностью созданные объекты или коллекции объектов, значения атрибутов которых соответствуют критериям, тем самым инкапсулируя фактическое хранилище и технологии запросов. Предоставляйте репозитории только для корней AGGREGATE, которые фактически нуждаются в прямом доступе. Держите клиента ориентированным на модель, делегируя все хранение объектов и доступ к REPOSITORIES."

Служба Grails может использоваться для реализации выделенного объекта репозитория, который просто делегирует свою работу Grails GORM. Стойкость решена с магией GORM. Каждый класс домена предоставляет набор динамических методов, которые разрешают типичные операции CRUD, включая запрос ad-hock.

Утверждения

"Состояние пост-условий операций и инвариантов классов и AGGREGATES. Если ASSERTIONS не могут быть закодированы непосредственно на вашем языке программирования, напишите им автоматические модульные тесты".

  • Взгляните на аннотации Groovy @Invariant, @Requires, @Ensures, они могут быть использованы для объявления индексов инвариантов DbC и Pre и постусловия
  • Когда вы создаете классы домена с помощью командной строки Grails, тестовые классы создаются автоматически, и это еще один механизм выражения утверждений в вашем домене.

Декларативный стиль дизайна

"Гибкий дизайн может позволить клиентскому коду использовать декларативный стиль дизайна. Чтобы проиллюстрировать, следующий раздел объединит некоторые из шаблонов в этой главе, чтобы сделать СПЕЦИФИКАЦИЯ более гибкой и декларативной".

Здесь Grails выделяется из-за динамической природы Groovy языка и поддержки шаблонов Builder для создания пользовательских DSL.

Многоуровневая архитектура

Приходит "из коробки" с Grails через предлагаемую "" Конвент Конфигурация" в виде многоуровневой MVC.

Ответ 2

В настоящее время мне неизвестны какие-либо книги, относящиеся к Grails и DDD. Лично я бы не сосредоточился только на Граале. Domain Driven Design - это способ мышления, способ организации вашего приложения и кода. Таким образом, он не связан с технологией.

Парадигма MVC не рассматривает модели как объекты доступа к данным. На самом деле он даже не упоминает уровень доступа к данным, поскольку он понимается под ним/инкапсулируется моделью. Это приводит к некоторым ошибкам при попытке использовать DDD с технологиями MVC на основе шаблона ActiveRecord, который объединяет логику домена и код доступа к данным в модель. Он работает очень хорошо... особенно в простых приложениях с небольшой логикой домена, где нет реального различия. Но когда ситуация становится более сложной, нужно иметь в виду, что модель!= Доступ к данным.

Лично я бы подумал об улучшении моего понимания DDD:

Ура!

Ответ 3

После прочтения этого вопроса я немного почитал как DDD, так и Grails. Я не уверен, что Grails должен был поддерживать DDD.

Однако я прочитал некоторые сообщения, которые Grails поддерживает DDD Grails и DDD

Однако я думаю, что Grails в основном поддерживает шаблон Active record, Разъяснение здесь

Для Grails каждый объект домена является совокупным корнем, это само по себе относится к DDD.

Средство обхода орехов Grails Aggregate #

Реализация DDD Java, можно ли использовать аналогичный пример реализации DDD-образа Grails?

Многие вещи, такие как репозитории, могут быть легко реализованы через Grails, мне очень нравится и думаю, что это увеличивает производительность.

Однако у меня есть сомнения, когда люди говорят, что Grails и DDD идут рука об руку.

Ответ 4

DDD - это технологический способ организации программного обеспечения.

Да DDD может быть реализован с использованием Grails.

Сударшан, вы указали, что Grails не справляется с концепцией совокупных корней. Есть ли какая-либо структура, с которой вы работали, имеет концепцию совокупного корня? В самих структурах не должно быть понятий DDD (если только он сам не является базой DDD, но я еще не сталкивался с платформами DDD).

Это идея и должна быть технологической агностикой, поэтому разработчики приложений должны включать такие понятия. В Grails довольно сложно различать сущность и совокупный корень, используя статические методы, такие как Person.get(1) или Person.findByName( "name" ), но это не так. Поэтому ответственность разработчиков заключается в том, чтобы отличить это от других средств, таких как использование конвенции.

Ответ 5

Я нашел эту статью, это может представлять определенный интерес. Я процитировал основной интерес.

"DK: динамические и расширяемые леса Grails позволяют легко применять принципы DDD, без ограничений и сложности некоторых DDD рамки".

http://www.infoq.com/articles/klein-grailsquickstartguide

Ответ 6

www.infoq.com/articles/ddd-in-practice

"Рамки, такие как Spring и поддержка Real Object Oriented (ROO), Hibernate и Dozer для проектирования и реализации модели домена. Другими системами поддержки DDD являются JMatter, Naked Objects, Ruby On Rails, Grails и Spring Модули XT Framework."

grails.org/doc/latest/guide/introduction.html

"Динамические структуры, такие как Rails, Django и TurboGears, помогли проложить путь к более современному способу мышления о веб-приложениях. Grails основывается на этих концепциях и значительно снижает сложность построения веб-приложений на платформе Java., однако, заключается в том, что он делает это, опираясь на уже созданные Java-технологии, такие как Spring и Hibernate."

Bascily, что работает с Spring, также будет работать с Grails.

Я надеюсь, что когда-нибудь сообщество предоставит нам всех ddd-образец, написанный в Grails.

dddsample.sourceforge.net

//spam mech не позволяет мне помещать больше двух ссылок в один пост, soz

Ответ 7

попробуйте прочитать Grails in Action, он представлен в главе 3. он представлен, позволяя вам работать над образцом проекта и даже показывать, пошаговую процедуру о том, как ее создавать с нуля, а также добавлять плагины и т.д. Я настоятельно рекомендую эту книгу, очень ценную ссылку.

Заметьте, что я тоже новый пользователь Grails.