Как я могу разделить логику домена и доступ к данным в Grails (и это хорошая идея)?
Многие программные приложения, которые мы пишем, в большей степени ориентированы на данные (базу), а в Grails часто сохраняются от классов обслуживания или контроллеров непосредственно к базе данных, настроенной в DataSource.groovy. Изменить базу данных легко, но на самом деле мы не зависим от реализации персистентности в коде.
Я пытаюсь написать приложение, открывающееся для различных реализаций сохраняемости и источников данных (не только базы данных), и фокусирующееся на бизнес-области, а не на объектах базы данных. Это также плюс при тестировании (легко написать фальшивую / имитацию персистентности). Изначально у меня есть только одна реализация персистентности - классы домена Grails, использующие GORM. Но есть вероятность, что в будущем я хотел бы иметь другие источники данных, кроме базы данных, например службы отдыха или что-то еще.
На данный момент у меня есть только база данных в качестве источника данных, и я делаю в основном грубые вещи (и некоторую логику предметной области). Я думаю, что я все еще застрял в «старом» мышлении, сосредоточенном на сохранении базы данных, потому что большинство моих бизнес-классов имеют эквивалент класса предметной области Grails, который является его копией. Когда нужно сохранить классы предметной области, я просто копирую свойства в предметный класс Grails.
Я не очень доволен этим решением. Я могу придумать как минимум два возможных улучшения / изменения:
- Мои классы предметной области Grails могли бы быть организованы более иначе, чем классы предметной области бизнеса, поэтому я не просто копирую свойства из одного класса в другой. Тем не менее, при чтении или записи из / в базу данных это по-прежнему будет включать в себя множество сопоставлений свойств от одного класса к другому.
- Может быть, есть способ использовать классы бизнес-домена из обычного пакета src / main / groovy и украсить их вещами GORM? Или как-то иначе разделить логику предметной области и настойчивость? Я видел, что это можно сделать, используя hibernate conf для классов домена. Это единственный способ?
Я видел несколько интересных обсуждений архитектуры Grails, включая чистую архитектуру, гексагональную архитектуру и ddd, но пока не нашел никаких примеров. Есть такие?
На данный момент, как я уже сказал, большая часть функциональности - это CRUD, но не все. Кроме того, в приложении может быть больше бизнес-логики, поэтому я бы предпочел не использовать «стандартную» архитектуру Grails с представлениями, контроллерами, службами и доменом. Мне нужно «базовое» приложение, которое не будет зависеть от представления / контроллеров grails и домена / GORM.