关闭。这个问题是opinion-based .它目前不接受答案。
想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.
3年前关闭。
Improve this question
随着我越来越多地使用 Grails,我发现自己在多个 Controller 中编写代码,看起来它确实应该是域类的一部分。有时,此域代码包含对服务类的调用。例如,我最近编写了一个看起来像这样的域方法:
class Purchase {
// Injected
def paymentService
String captureTransactionId
Boolean captured
// ...
def capture() {
captureTransactionId = paymentService.capturePurchase( this )
captured = captureTransactionId != null
}
我不觉得写这段代码很脏,但是我还没有研究过 Grails 中的最佳设计实践,所以我想得到一些意见。
最佳答案
我来回处理这样的事情。在使用 Grails 之前,我对贫血的领域类和将所有内容都放在帮助程序中没有任何问题。我经常以贫乏的类(class)结束的一个重要原因是验证。在类中验证可空性、长度等很简单,但唯一性需要数据库检查,这与域类(在非 Grails 应用程序中)无关,因此我将其移至帮助程序。现在我已经在两个地方进行了验证,所以我将合并到帮助程序中,并留下一个仅数据类。
但是 Grails 通过将 GORM 方法连接到域类中来取代对 DAO 的需求,并且通过将验证放入域类中来取代对验证器的需求。因此,在决定哪些业务逻辑应该放在域类中以及哪些应该放在服务或其他帮助程序中时,这会产生问题——服务是一个很好的地方,可以将可能需要的业务逻辑放在域类方法或验证器中。
是的,它不是纯面向对象的,是的,您创建了一个循环(服务调用域类,域类调用服务),不,这不是“Spring 方式”,但很多 Grails 不是“Spring 方式”。
像这样的耦合确实使得将应用程序分离为组件或插件以供重用变得更加困难,但使用“def paymentService”声明服务有很大帮助,因为您没有与包名称或实现耦合。
关于grails - 从域对象调用 Grails 服务是不是很糟糕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3653795/