ChatGPT解决这个技术问题 Extra ChatGPT

MVCS - 模型视图控制器服务

我已经使用 MVC 很长时间了,听说过“服务”层(例如在 Java Web 项目中),我一直想知道这是否是一种真正的架构模式,因为我找不到很多关于它。

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

“我一直在想,这是否是一种真正的架构模式”……嗯,与其他设计模式差不多或不那么真实 :) 这一切都是为了选择最有意义的抽象——在这种情况下,MVCS 似乎当您处理各种上游数据源(数据库模型、其他 Web 服务等)时,它是比 MVC 更有用的抽象,尤其是当您开始考虑将您的工作公开为服务时。当我有一个后来公开为 REST API 的 Web 应用程序时,这种模式帮助我重用了很多代码。

A
Aashutosh Rathi

服务层可以有多种解释方式,但它通常是您拥有核心业务处理逻辑的地方,位于 MVC 架构之下,但位于数据访问架构之上。

例如,您的完整系统层可能如下所示:

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

然后服务层将负责:

从各种数据源(或数据访问对象)检索和创建您的“模型”。

跨各种存储库/资源更新值。

执行特定于应用程序的逻辑和操作等。

您在 MVC 中使用的模型可能来自也可能不来自您的服务。您可能希望获取您的服务提供给您的结果,并将它们处理成更特定于您的媒体的模型(例如:网页)。


我通常使用服务进行外部访问。虽然 MVC 将包含我所有的应用程序特定逻辑,但我将使用 DBService 或 FacebookOAuthService 之类的东西来进行对其他系统的所有外部调用。或者包装第三方库而不是紧密集成,可以更容易地切换库。对我来说,考虑这样的服务很有意义。
除此之外,来自服务层的模型将更像是一个数据传输对象,这可能会或可能不会直接转换为直接满足视图要求的东西
这使它听起来就像是 MVC,但增加了外观以保持控制器清洁。
K
Kbdavis07

我自己一直在考虑这种模式,而在其他任何地方都没有看到对此的任何参考,并在 Google 上搜索并在这里找到了您的问题 :)

即使在今天,也没有多少人谈论或发布关于

视图-控制器服务模式。

https://i.stack.imgur.com/jWS06.jpg

想让你知道其他人也有同样的想法,上面的图片是我如何看待它应该是这样的。

目前我正在我正在从事的项目中使用它。

我将它放在模块中,上图中的每一层都包含在它自己的自包含模块中。

https://i.stack.imgur.com/FeLwQ.jpg

服务层是“连接器”“中间人”“服务器端控制器”,因为“客户端”端控制器为客户端做的,“服务”为服务器做的。

换句话说,客户端“控制器”仅与“服务”即服务器端控制器“对话”。

控制器 ---> 来自 <----- 服务层的请求和接收

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

服务本身不做任何事情,只是将服务器层与他们需要的东西连接起来。

这是一个代码示例:

https://i.stack.imgur.com/D5Jpw.png


我对这种架构风格的唯一担忧是假设 DataModel 将具有与“视图”要求相同的“形状”。如果它们是 1 比 1 或接近它,你可以专门为视图阻塞几个属性,我想这没关系,但很多时候 DataModel 是从存储角度设计的,而 ViewModel 是从观点观点。
有“DataModels”和“ViewModels”,上图做的很快,做的很差:)
J
Jonathan Port

多年来我一直在使用 MVCS 模式,但我不知道其他人做过,因为我在网上找不到任何可靠的信息。如果你愿意,我会本能地开始使用它,它从来没有让我对 Laravel 项目失望过。我会说它对于中型项目来说是一个非常可维护的解决方案,尤其是在业务逻辑不断变化的敏捷环境中工作时。关注点分离非常方便。

说到这里,我发现服务层对于小型项目或原型来说是不必要的,什么都不是。在制作原型时,我犯了一个错误,那就是让项目过于复杂,这最终意味着你需要更长的时间才能把你的想法拿出来。如果您认真考虑在中期维护项目,那么 MVCS 是 IMO 的完美解决方案。