Grails - это платформа par-excellence для реализации приложений в стиле доменного дизайна. В центре подхода Grails лежат предметные классы, которые управляют всем процессом разработки. Как вы, наверное, догадались, выбор домена слов в Grails - это не просто совпадение.
Вы начинаете с определения своих доменных классов, а затем вы можете использовать Grails, чтобы выполнить всю тяжелую работу по обеспечению устойчивости и созданию графического интерфейса пользователя. Стоит отметить, что когда книга DDD была написана, это было до того, как были созданы Grails или другие подобные фреймворки, поэтому многие проблемы, рассматриваемые в книге, связаны с проблемами, решаемыми или значительно уменьшенными фреймворком.
Некоторые концепции DDD, разрешенные Grails
Я буду использовать Сводка шаблона DDD для адресации различных элементов DDD. (Цитаты, выделенные курсивом в тексте ниже).
Модель домена
Модель домена структурирована с помощью классов домена, сервисов, репозиториев и других шаблонов DDD. Давайте рассмотрим каждый из них подробно.
Сущность
«Когда объект отличается по своей идентичности, а не по атрибутам, сделайте это первичным для своего определения в модели»
Это доменные классы в Grails. Они приходят с упорством, уже решенным через GORM. Модель может быть точно настроена с помощью GORM DSL. Взгляните на свойство hasOne против ownTo. Его можно использовать для определения жизненного цикла сущностей и их отношений. ownTo приведет к каскадному удалению связанных объектов, а другие - нет. Итак, если у вас есть объект Car, вы можете сказать, что Motor «принадлежит» Car, и в этом случае Car - это совокупный корень, а Motor - совокупность. Обратите внимание, что я говорю здесь об отношениях жизненного цикла между сущностями, а не о постоянстве.
Объекты значения
«Если вам важны только атрибуты элемента модели, классифицируйте его как ЦЕННОСТНЫЙ ОБЪЕКТ. Сделайте так, чтобы оно выражало значение атрибутов, которые оно передает, и придавало ему функциональность. Рассматривайте ЦЕННЫЙ ОБЪЕКТ как неизменный. Не называйте это ... »
В Grails вы можете использовать «внедренное» свойство в поле GORM для управления объектом значения. Доступ к объекту-значению возможен только через сущность, к которой он принадлежит, не имеет собственного идентификатора и сопоставляется с той же таблицей, что и сущность, к которой он принадлежит. Groovy также поддерживает аннотацию @ Immutable , но я не уверен, как она работает с Grails.
Услуга
«Если значительный процесс или преобразование в домене не является естественной ответственностью объекта ENTITY или VALUE, добавьте операцию к модели в качестве автономного интерфейса, объявленного как SERVICE. Сделайте СЕРВИС безгражданской. ”
Так же, как сущности, службы изначально поддерживаются в Grails. Вы размещаете свою Службу Grails в каталоге служб в своем проекте Grails. Услуги поставляются со следующим из коробки:
- Внедрение зависимостей
- Поддержка транзакций
- Простой механизм представления сервисов как веб-сервисов, чтобы к ним можно было получить удаленный доступ.
Модули
«Выберите МОДУЛИ, которые рассказывают историю системы и содержат сплоченный набор понятий. «
Grails Механизм плагина обеспечивает это и многое другое: очень простой способ установки и создания плагинов, определяет, как приложение может переопределять плагины и т. Д.
1063 * Агрегаты *
«Сгруппировать объекты и объекты стоимости в совокупности и определить границы вокруг каждого. Выберите один объект ENTITY, который будет корнем каждого AGGREGATE, и управляйте всем доступом к объектам внутри границы через корень. Разрешить внешним объектам хранить ссылки только на корень. ”
Я уже упоминал некоторые жизниМеханизмы управления циклом. Вы можете использовать Grails Services и механизм контроля доступа к языку для обеспечения контроля доступа. У вас может быть служба Grails, играющая роль репозитория DDD, которая разрешает доступ только к Aggregate Root. Хотя контроллеры в Grails могут напрямую получать доступ к операциям GORM на сущностях, я бы сказал, что для лучшего многоуровневого проектирования в контроллеры должны быть добавлены службы, делегирующие операции GORM Active Record.
Фабрика
«Перенести ответственность за создание экземпляров сложных объектов и AGGREGATES на отдельный объект, который сам по себе не может нести ответственность в модели предметной области, но все еще является частью конструкции предмета».
Groovy builders - отличная альтернатива для построения сложных объектов с помощью богатых DSL. В DDD, фабрики являются более свободным термином и не переводятся непосредственно в GoF Абстрактная фабрика или фабричный метод. Groovy-сборщики - это DSL-реализация шаблона GoF Builder.
Хранилища
«Для каждого типа объекта, которому требуется глобальный доступ, создайте объект, который может создать иллюзию коллекции в памяти всех объектов этого типа. Настройте доступ через известный глобальный интерфейс. Предоставьте методы для добавления и удаления объектов, которые будут инкапсулировать фактическую вставку или удаление данных в хранилище данных. Предоставьте методы, которые выбирают объекты на основе некоторых критериев и возвращают полностью созданные экземпляры объектов или коллекций объектов, значения атрибутов которых соответствуют критериям, тем самым инкапсулируя фактическую технологию хранения и запросов. Предоставляйте репозитории только для AGGREGATE-корней, которые действительно нуждаются в прямом доступе. Держите клиента сосредоточенным на модели, делегируя все хранилище объектов и доступ к хранилищам. ”
Служба Grails может использоваться для реализации выделенного объекта Repository, который просто делегирует свою работу Grails GORM. Стойкость решается с помощью магии ГОРМ. Каждый класс Domain предоставляет набор динамических методов, которые разрешают типичные операции CRUD, включая запросы ad-hock.
1091 * Утверждения *
«Государственные постусловия операций и инварианты классов и AGGREGATES. Если ASSERTIONS не могут быть закодированы непосредственно на вашем языке программирования, напишите для них автоматизированные модульные тесты. ”
Взгляните на Groovy @ Invariant, @Requires, @ Ensures аннотации, их можно использовать для объявления инвариантов стиля DbC и предварительных и постусловий
Когда вы создаете свои доменные классы с помощью командной строки Grails, тестовые классы создаются автоматически, и это еще один механизм для выражения утверждений в вашем домене.
Декларативный стиль оформления
«Благодаря гибкому дизайну клиентский код может использовать декларативный стиль оформления. Чтобы проиллюстрировать это, в следующем разделе будут собраны некоторые шаблоны из этой главы, чтобы сделать СПЕЦИФИКАЦИЮ более гибкой и декларативной. ”
Именно здесь Grails выделяется из-за динамического характера языка Groovy и поддержки шаблонов Builder для создания пользовательских DSL.
Многоуровневая архитектура
Поставляется «из коробки» с Grails через предлагаемую структуру приложения « Convention over Configuration » в форме многоуровневой реализации на основе MVC.