MVC应用程序中的服务是否应返回实体或实体列表

时间:2014-03-20 15:44:21

标签: java spring hibernate

我使用Spring和Hibernate的MVC应用程序

我让每个控制器调用调用dao的服务层

controller > service > dao

服务是否应始终返回实体?

我试图将逻辑从控制器移动到服务。目前这是控制器中的逻辑

autenticate

retrieve user information (service call)

retrieve his appointments (other service call)

create a status response in xml

return appointemnts

正如您所看到的,如果我移动服务中的所有逻辑,我将需要一个返回xml而不是用户或appointemts列表的服务调用。

这是正确的方法还是我应该保留控制器中的逻辑并从仅服务实体返回?

5 个答案:

答案 0 :(得分:0)

据我了解,我觉得这对你来说并不重要。你必须记住的是

  • 保持服务层清洁数据访问实施(例如:import java.sql.whatever在服务层内部不是一个坏主意)
  • 服务层是进行声明式事务管理的理想场所。想法是编写事务性服务层方法,在此之下,有一个完全天真的DAO层,它将注入连接,在外部管理它们的错误,没有提交,没有回滚......

您将逻辑移出控制器层的想法非常合理。您对XML的关注是合法的,但是,无论您的服务层返回什么,请始终记住格式是表示层的问题。您的服务层(理想情况下也是控制器)应该完全不知道将为用户呈现的格式。这是一种可以在您为应用程序设计的许多表示层中重用的适当服务层的方法。

答案 1 :(得分:0)

很好的问题,但很难回答。

我会尽力帮助您找到适合您的答案:

服务摘要是什么?

Controller抽象了什么?

一组可能的答案是:

Controller抽象访问机制(xml,http,...)

服务对业务逻辑进行抽象(谨防矛盾),例如:谁可以看到约会

Daos抽象了存储东西的事实。从Daos以相同的方式检索约会,尽管一个可能来自LDAP系统而另一个来自关系数据库。

如果这些恰好是您的答案,您应该将用户信息的检索和约会的检索以及用户身份验证检索到服务,并在xml保留在Controller中时进行呈现。

但是,您和您的团队完全取决于您需要对应用程序进行切片和切块。

帮助我提出合理答案的一个实验是考虑其他客户。如果其他应用程序需要此信息,该怎么办他们将访问什么,API应该如何?

答案 2 :(得分:0)

我会说不,服务不应该总是返回实体(或实体列表)。

如果没有实际代码,很难说,但有时以下方法效果更好:

controller > facade > service > dao

Facade为您的控制器提供了一种创建约会并返回xml的方法。同时,服务保持清洁,让我们说只返回用户实体

http://en.wikipedia.org/wiki/Facade_pattern

答案 3 :(得分:0)

不,服务可以返回您想要的所有内容。它为您提供的内容没有限制。即使是DAO或存储库也不必返回实体perse。他们只需要从数据库中返回任何你想要的东西。

也就是说,使用Spring ,有一些首选方式来处理某些任务。例如,您希望从服务返回的XML可以由消息转换器生成。您需要做的就是在请求中请求XML并从使用ResponseEntity <T>注释的处理程序返回对象或@ResponseBody

尽可能多地移动并保持控制器的逻辑。执行大量工作的控制器很难测试。这也适用于顺便提一下的服务。最好将所有内容分成易于管理的小部分,而不是在一个地方拥有大量的工作单元。

答案 4 :(得分:0)

我不会从服务层返回xml。考虑代码重用。如果以后在其他服务上需要该服务该怎么办?在xml或用户对象列表中显示的用户列表将更有用。如果以后需要提供用户json怎么办?控制器应将数据按摩成可显示的格式。至少那是我的意见。