Grails:服务与Groovy类

Grails:服务与Groovy类,grails,groovy,service,grails-controller,Grails,Groovy,Service,Grails Controller,文件说: Grails团队不鼓励 核心应用程序逻辑的嵌入 在控制器内部,因为它没有 促进重复使用和清洁分离 令人关切的问题 我在src/Groovy文件夹中有一个API控制器和几个Groovy类。这些类只是实现我的应用程序逻辑,因此API控制器中的操作是这样工作的: //index page def index = { render new IndexApi().index(params) as JSON } 我很好奇——有什么理由把我的应用程序逻辑从普通groovy类转移到服务中吗?

文件说:

Grails团队不鼓励 核心应用程序逻辑的嵌入 在控制器内部,因为它没有 促进重复使用和清洁分离 令人关切的问题

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

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

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

如果你想要事务性行为,你应该把逻辑放到服务中。否则您必须自己处理,这不符合使用Grails的精神


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

原因有三:

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

  • 它使您的逻辑更易于测试

  • 您确实不想手动管理事务

  • 如果要将所有内容都放在控制器中,则需要创建Web运行时才能运行任何测试。如果您的逻辑在外部,您可以从HTTP请求和所有其他源复制所需的数据,只需调用代码即可。因此,逻辑并不依赖于HTTP会话、请求或任何您不希望的内容


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

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