Я создал приложение, используя Grails, логически система разделяется на несколько модулей. сначала я отделил логику, реализовав пакет, представляющий модули.
Но проблема возникает, когда мне нужно «отделить» приложение. Поскольку некоторым клиентам не нужны все модули, им просто нужны некоторые модули, и комбинация может быть разной для каждого клиента.
Техническая проблема заключается в разделении кода между модулями Grails. Доменный класс действительно тесно связан. Я хочу переписать свое приложение просто для того, чтобы разделение происходило не только логически, но и каждый модуль имел отдельную кодовую базу. Так что другая команда, которая разрабатывает разные модули, работает на другой базе кода.
Пример реальной проблемы такой:
Модули: пользовательский (основной), календарь, академический
package user.group
import academic.RaportSummary
import academic.examResult
class Student {
static hasMany = [exams:ExamResult,raports:RaportSummary]
}
package calendar
class Semester {
}
package academic
import calendar.Semester
import user.group.Student
class SubjectSummary {
static belongsTo = [student:Student, semester:Semester]
}
class RaportSummary {
static belongsTo = [student:Student]
}
Поскольку эта зависимость от кода уровня, я не могу отделить пользователя, календарь, класс академического домена, даже некоторым клиентам не нужен академический модуль. Приложение тесно связано, поскольку класс домена не может быть разделен.
Есть какая-то альтернатива, которая приходит мне в голову:
- Реализуйте динамический плагин домена, чтобы сделать класс домена более переносимым (http://burtbeckwith.com/blog/?p=364),, но я все еще не понимаю, как интегрировать это в приложение
- Создайте каждый модуль как плагин (с полными доменами, контроллерами и представлениями), но это не решает проблему, домен зависимости все еще необходим для той же кодовой базы.
Вопрос в том, как создать объект-адаптер между классами домена в Grails? объект "адаптер" может быть классом обслуживания. С этим адаптером связь между доменом не обязательно проверяется во время компиляции
может быть решение вот так:
class Student {
//dependency to other modules
//checked at runtime
def hasManyOnOtherModules = ["exams:academic.ExamResult"]
}
Идеальная реализация - каждый модуль может работать и тестироваться отдельно.