2010-04-01 63 views
18

文件说:的Grails:服务VS Groovy类

Grails团队不赞成在该 嵌入核心应用程序逻辑 内的控制器,因为它不 促进再利用和清楚的关注点分离 。

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

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

我很好奇 - 没有任何理由从简单的常规类移到我的应用程序逻辑到服务?

回答

9

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

我自己并不是一个Grails专家,我把我的'非事务性'类放在服务层之外,比如构建器类,帮助器以及其他非事务性但是从服务层使用的逻辑。

7

原因有三:

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

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

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

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

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

20

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