Как преодолеть жесткую зависимость между классом домена Grails - PullRequest
1 голос
/ 04 марта 2011

Я создал приложение, используя 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]
}

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

Есть какая-то альтернатива, которая приходит мне в голову:

  1. Реализуйте динамический плагин домена, чтобы сделать класс домена более переносимым (http://burtbeckwith.com/blog/?p=364),, но я все еще не понимаю, как интегрировать это в приложение
  2. Создайте каждый модуль как плагин (с полными доменами, контроллерами и представлениями), но это не решает проблему, домен зависимости все еще необходим для той же кодовой базы.

Вопрос в том, как создать объект-адаптер между классами домена в Grails? объект "адаптер" может быть классом обслуживания. С этим адаптером связь между доменом не обязательно проверяется во время компиляции

может быть решение вот так:

class Student {

  //dependency to other modules
  //checked at runtime
  def hasManyOnOtherModules = ["exams:academic.ExamResult"] 

}

Идеальная реализация - каждый модуль может работать и тестироваться отдельно.

Ответы [ 2 ]

1 голос
/ 04 марта 2011

Ваш вопрос довольно сложный, и вам придется пройти редизайн, но ... ничего действительно невозможного.

1 - Удалить циклические зависимости

Без удаления этих зависимостей у вас нет шансовмодулировать ваше приложение.Поскольку пользователь является вашим базовым пакетом, вам нужно удалить все внешние зависимости из этого пакета.В вашем примере это означает, что домен Student должен будет удалить ссылку на ExamResult и RaportSummary т.е.

class Student {
} //no hasMany 

и

class ExamResult {
  Student student
}

class RaportSummary {
  Student student
}

Затем вы можете создать несколько методовкак RaportService.getRaports(student) { Raports.findAllbyStudent(student)}

2 - Сделать ваши пакеты как плагины

Лучший способ удовлетворить ваши требования - это создать плагины grails для пользователя, календаря и академических с зависимостями, такими как:

  • user плагин не зависит
  • calendar плагин не зависит (или может зависеть от пользовательского плагина)
  • academic плагин зависит от user и calendarплагин

3 - Создайте свое приложение

Затем, наконец, в соответствии с вашим клиентом, вы можете создать свое приложение только с плагином ученика или со всеми вашими плагинами

Etвуаля.

0 голосов
/ 04 марта 2011

(3). Я не пробовал, но я уверен, что вы можете использовать доменные классы из плагинов .

Таким образом, вы можете создавать следующие плагины: user-core, calendar (в зависимости от user-core) и academic (в зависимости от user-core и calendar), каждый из которых предоставляет свои собственные доменные классы и использует классы из зависимостей. , Так что вам не придется дублировать классы поверх плагинов.

...