从域对象调用Grails服务是不好的设计?

Jav*_*mae 17 grails

因为我越来越多地使用Grails,我发现自己在多个控制器中编写代码,看起来它应该是域类的一部分.有时,此域代码包含对服务类的调用.例如,我最近编写了一个看起来像这样的域方法:

class Purchase {

    // Injected
    def paymentService

    String captureTransactionId
    Boolean captured

    // ...

    def capture() {
        captureTransactionId = paymentService.capturePurchase( this )
        captured = captureTransactionId != null
    }
Run Code Online (Sandbox Code Playgroud)

我觉得编写这段代码并不是很脏,但我还没有对Grails的最佳设计实践进行研究,所以我想得到一些意见.

Bur*_*ith 15

我和这样的东西来回走动.在Grails之前,我对贫血领域课程没有任何问题,并将所有内容都放在帮手中.我经常以贫血课程结束的最重要原因是验证.在类中验证可空性,长度等很简单,但唯一性需要数据库检查,并且与域类(在非Grails应用程序中)无关,所以我将其移动到帮助程序.现在我已经在两个地方进行了验证,所以我将在帮助器中进行整合,并留下一个仅限数据的类.

但Grails通过将GORM方法连接到域类来替换DAO的需求,并且还通过在域类中进行验证来取代验证器的需要.因此,在决定域类中应该包含哪些业务逻辑以及服务或其他帮助器中应该包含哪些内容时,这会产生问题 - 服务是放置域类方法或验证器中可能需要的业务逻辑的绝佳位置.

是的,它不是OO-pure,是的,你创建一个循环(服务调用域类,域类调用服务),不,它不是"Spring方式",但很多Grails不是"Spring方式".

像这样的耦合确实使得将应用程序分离成组件或插件以便重用变得更加困难,但是使用"def paymentService"声明服务有很大帮助,因为您没有加入包名称或实现.