【发布时间】:2011-03-04 00:29:30
【问题描述】:
我已经使用 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"]
}
理想的实现是每个模块都可以单独运行和测试。
【问题讨论】:
标签: design-patterns grails domain-driven-design oop