MVCS - 模型视图控制器服务

94

我长期以来一直使用MVC,并听说过在Java Web项目中使用"服务(Service)"层,我一直在想,这是否是一个真正的架构模式,因为我找不到太多关于它的信息。

MVCS的想法是在控制器和模型之间添加一个服务层(Service layer),封装所有可能出现在控制器中的业务逻辑。这样,控制器只需要转发和控制执行。您可以在许多控制器中调用服务(例如,网站和Web服务),而无需复制代码。


3
我一直在想这是否是一个真正的建筑模式……嗯,它并不比其他设计模式更或更少真实 :) 它关键在于选择最有意义的抽象层 - 在这种情况下,MVCS似乎比MVC更有用,当你处理各种上游数据源(数据库模型,其他Web服务等)时,特别是当您开始考虑将您的工作公开为服务时。这个模式帮助我在将网页应用程序公开为REST API时重复使用了很多代码。 - Joe
3个回答

109

服务层可以有很多种解释,但通常是指核心业务处理逻辑所在的层,位于MVC架构下面,数据访问架构上面。

例如,完整系统的分层可能如下:

  1. 视图层:您选择的MVC框架及其代码
  2. 服务层:您的控制器将调用此层的对象来获取或更新模型等请求。
  3. 数据访问对象:这些是抽象层,服务层将调用它们以获得/更新所需的数据。该层通常会调用数据库或其他系统(例如LDAP服务器、Web服务或NoSql类型的DB)

服务层将负责:

  • 从各种数据源(或数据访问对象)中检索和创建您的“模型”。
  • 跨各种仓库/资源更新值。
  • 执行特定于应用程序的逻辑和操作等。

您在MVC中使用的模型可能来自于服务层,也可能不来自此层。您可能希望将服务给出的结果进行操作,使其更适合于您的媒介(例如Web页面)的模型。


2
我通常使用服务进行外部访问。虽然MVC将包含所有我的应用程序特定逻辑,但我会使用类似DBService或FacebookOAuthService的东西来处理对其他系统的外部调用。或者为了更轻松地切换库而包装第三方库,而不是紧密集成。对我来说,像这样考虑服务非常有意义。 - Lex
此外,您的服务层中的模型将更多地是数据传输对象,这可能直接转换为满足视图要求的内容,也可能不是直接的。 - hanzolo
1
这让人觉得它只是带有额外门面的MVC,以保持控制器的清洁。 - David
自从我开始使用Spring MVC进行开发以来,我已经使用了这种模式多年了。它非常简单,但它与清晰架构模式有多大不同?它是其分支吗?当我开始新工作时,我只是继续使用这种模式,因为它似乎很合乎逻辑和“清晰”。但最近,我参与了一个使用代码中的用例概念的项目,这似乎比这种简单的分层架构更复杂。 - berimbolo

23

我之前一直在思考这个模式,但没有在任何地方看到相关参考资料,后来在谷歌上搜索时找到了你的问题 :)

即使今天也没有太多人谈论和发布关于View-Controller Service模式的内容。

enter image description here

想让你知道其他人也在思考这个模式,上面的图片就是我如何看待它应该是什么样子。

目前我正在使用这个模式在一个项目中。

我将它分成几个模块,每个层级在上面的图片中都有自己独立的模块。

enter image description here

服务层是"连接器"、“中间人”、“服务器端控制器”,它是客户端控制器为客户端所做的事情在服务器端的实现。

换句话说,客户端的“控制器”只与“服务”(即服务器端控制器)通信。

控制器 ---> 请求并从<----- 服务层接收

服务层获取或提供服务器端需要的信息。

服务本身不做任何事情,只是连接服务器层与它们所需的内容。

这里是一个代码示例:

enter image description here


我对这种架构唯一的担忧是假设DataModels将与“View”的要求具有相同的“形状”。如果它们是1对1或接近1对1的,您可以为视图添加一些属性,那么我想这还可以,但很多时候,DataModels是从存储角度设计的,而ViewModel是从视图角度设计的。 - hanzolo
有“数据模型”和“视图模型”,上面显示的图像是快速而草率地完成的 :) - Kbdavis07

4

我已经使用MVCS模式多年了,但我并不知道其他人是否也在使用,因为我在网上找不到任何可靠的信息。如果您愿意的话,我会本能地开始使用它,并且对于Laravel项目来说,它从未让我失望。我认为它是一个非常可维护的解决方案,特别是当您在敏捷环境中工作时,其中业务逻辑经常发生变化。拥有这种关注点的分离非常方便。

话虽如此,我发现在小型项目或原型中,服务层是不必要的之类的。当我制作原型时,犯了过度复杂化项目的错误,这最终只意味着需要更长的时间才能实现您的想法。如果您认真考虑在中期内维护项目,那么在我看来,MVCS是一个完美的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接