19

文档说:

Grails 团队不鼓励将核心应用程序逻辑嵌入到控制器中,因为它不会促进重用和关注点的清晰分离。

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

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

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

4

3 回答 3

20

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

于 2010-04-01T14:11:05.207 回答
9

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

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

于 2010-04-01T10:13:26.973 回答
8

原因有以下三个:

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

  2. 它使您的逻辑更容易测试。

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

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

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

于 2010-04-01T10:16:30.627 回答