代码之家  ›  专栏  ›  技术社区  ›  Javid Jamae

从域对象调用Grails服务是一种糟糕的设计吗?[关闭]

  •  17
  • Javid Jamae  · 技术社区  · 14 年前

    随着我越来越多地使用Grails,我发现自己在多个控制器中编写的代码看起来真的应该是域类的一部分。有时,此域代码包含对服务类的调用。例如,我最近编写了一个类似以下内容的域方法:

    class Purchase {
    
        // Injected
        def paymentService
    
        String captureTransactionId
        Boolean captured
    
        // ...
    
        def capture() {
            captureTransactionId = paymentService.capturePurchase( this )
            captured = captureTransactionId != null
        }
    

    4 回复  |  直到 14 年前
        1
  •  15
  •   Burt Beckwith    14 年前

    我就这样来来回回的。在Grails之前,我对贫乏的域类和将所有内容放在helpers中没有任何问题。我经常上贫血课的主要原因是验证。在类内部验证可空性、长度等很简单,但唯一性需要数据库检查,而这与域类(在非Grails应用程序中)无关,因此我将其移动到助手。现在我在两个地方进行了验证,因此我将在helper中合并,并将剩下一个仅数据的类。

    但是Grails通过将GORM方法连接到域类中来代替DAOs,并且通过将验证放在域类中来代替对验证器的需要。因此,在决定哪些业务逻辑应该放在域类中,哪些应该放在服务或其他帮助程序中时,这就产生了问题—服务为将可能需要的业务逻辑放在域类方法或验证程序中提供了一个很好的位置。

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

        2
  •  3
  •   duffymo    14 年前

    我不认为域/模型类应该调用服务。应该是相反的。

    服务可以编排其他服务来实现用例。我认为这是正确的方法。

        3
  •  3
  •   Lodovik    14 年前

    我只发表个人意见。由于grails支持将服务自动注入到域类中(不同于将服务注入到标准groovy类中,而标准groovy类必须自己配置),因此我猜它的目的是以这种方式使用,因此这并不是一个坏的做法。

    它还使代码更易于阅读,例如myDomainInstance.someUsefulMethod方法(),比someService.somesusefulmethod方法(myDomainInstance)”(希望你知道我的意思)。

        4
  •  0
  •   Fletch    14 年前

    在像这个例子这样的情况下,走一条路或另一条路怎么样:要么把paymentService.capturePurchase付款服务()将代码放在Purchase类中,或者您可以将所有逻辑放在服务中?