Grails:服务 VS Groovy 类

Posted

技术标签:

【中文标题】Grails:服务 VS Groovy 类【英文标题】:Grails: Services VS Groovy classes 【发布时间】:2011-02-03 07:31:06 【问题描述】:

文档说:

Grails 团队不鼓励 嵌入核心应用逻辑 在控制器内部,因为它没有 促进重复使用和清洁分离 的担忧。

我在 src/groovy 文件夹中有一个 API 控制器和几个 Groovy 类。这些类只是实现了我的应用程序逻辑,因此 API 控制器中的操作以这种方式工作:

//index page
def index = 
    render new IndexApi().index(params) as JSON

我很好奇 - 有什么理由将我的应用程序逻辑从普通的 groovy 类转移到服务中?

【问题讨论】:

【参考方案1】:

实际上,服务不仅仅是交易。服务非常适合零配置可注入单例组件,它们可以在不重新启动整个 grails 环境的情况下重新加载,并且可以作为人工制品被发现,因此可以通过远程插件自动公开。

【讨论】:

【参考方案2】:

如果您想要交易行为,您应该将您的逻辑放在服务中。否则你将不得不自己处理它,这不符合使用 Grails 的精神。

我本人不是 Grails 专家,因此我将“非事务性”类放在服务层之外,例如构建器类、帮助程序和其他非事务性但从服务层使用的逻辑。

【讨论】:

【参考方案3】:

有三个原因:

    它使控制器更小 -> 更易于理解和维护

    它让你的逻辑更容易测试。

    您真的不想手动管理交易。

如果您将所有内容都放在控制器中,则需要创建 Web 运行时才能运行任何测试。如果您的逻辑在外部,您可以从 HTTP 请求和所有其他来源复制您需要的数据,然后调用代码。所以逻辑不依赖于 HTTP 会话、请求或任何你不想做的事情。

例如,要测试 JSP,您需要一个 HTTPRequest。对于请求,您需要一个 HTTPSession 和一个 JSPWriter。那些需要会话上下文。因此,为了能够运行单个测试,您需要设置和初始化一大堆类。所有这些都是接口,实现是私有的。所以你必须自己实现实际的方法(全部 300 个)。你最好把这件事做好,否则你的测试不会测试你想要的。

【讨论】:

以上是关于Grails:服务 VS Groovy 类的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Grails 服务注入 src/groovy 类

关于grails连接数据库

Grails 没有从 BuildConfig.groovy 将 jars 添加到类路径

环境特定的 Grails 服务配置

如何使用 Spring resource.groovy 正确注入 Grails 服务

Grails 和 Groovy 元类包名称约定