DDD с Граалем - PullRequest
       25

DDD с Граалем

14 голосов
/ 04 марта 2010

Я не могу найти какую-либо информацию о доменно-управляемом дизайне (DDD) с Grails.

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

Ответы [ 7 ]

35 голосов
/ 18 августа 2011

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.

7 голосов
/ 13 марта 2010

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

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

Лично я хотел бы улучшить мое понимание DDD:

Ура!

3 голосов
/ 01 августа 2011

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

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

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

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

Обходной путь к корневому соединению Grails

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

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

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

2 голосов
/ 11 августа 2011

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

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

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

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

0 голосов
/ 10 января 2012

www.infoq.com / статьи / ддд-в-практике

"Такие фреймворки, как Spring и Real Object Oriented (ROO), Hibernate и Dozer, помогают в разработке и реализации модели предметной области. Другие платформы, поддерживающие реализацию DDD, - это JMatter, Naked Objects, Ruby On Rails, Grails и Spring Modules XT Framework. "

grails.org / DOC / последняя / руководство / introduction.html

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

В основном то, что работает с Spring, также будет работать с Grails.

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

dddsample.sourceforge.net

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

0 голосов
/ 05 августа 2011

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

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

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

0 голосов
/ 06 марта 2010

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

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

...