`
bljoohe
  • 浏览: 1706 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

简单的MVC就够了吗?浅谈service Layer的引入

 
阅读更多
昨天在来吧程序猿l8chengxuyuan.com看到一篇对mvc文章的描述,结合别人的内容简单的总结
MVC是web开发中常见的程序结构。

简单的mvc结构如下:

view层:显示层。

control层:业务层,集合了各种action。

model层:模型层,一般和数据打交道。简单的sample:一个表对应一个model类。

其中control层调用model层的方法,实现对数据的访问。

采用这样的结构在一定程度上,可以做到代码清晰,较容易扩展,代码的管理复杂度较低。

但是如果是业务很多,逻辑又很复杂的网站,如果再加上开发人员的水平参差不齐,那必然会导致下面的情况:

1.action中的代码越来越长,逻辑越来越复杂,不同action之间看起来有很多可以重用的代码, 但是真要进行重构的话,又非常困难。

2.model层中包含的方法越来越多,有些方法也过于复杂。甚至在不少方法中还包含了业务逻辑。

3.代码的修改,还是牵一发而动全身。

4.代码难以进行自动化测试。

本来以为引入了mvc,程序的管理复杂度问题就高枕无忧了,但现在又面临了相同的问题了。

以我最近的所学看,在mvc中再引入service层,可以在很大程度上避免或者缓解上述问题。

原有的mvc结构改成如下:

1.view层:显示层。
2.control层:业务层,集合了各种action。
3.service层。

4.DAO层。

原来的model层不见了,增加了service层和DAO层。DAO,即Data Access Object,数据访问接口,数据访问:顾名思义就是与数据库打交道。

在这个结构中,control不直接和DAO联系,

需要操作数据的时候,通过service层访问DAO层来实现。

service层做的事情,不仅仅是调用DAO操作数据,还会包含了一定的业务逻辑。整个程序的设计,也变成了针对服务进行设计。

这样做的好处是:

1.control层中的action得以精简,因为action中的一些逻辑,被重构成一个个的服务。而不同的action也可以重用服务了。

2.只负责和数据打交道的DAO层,相比之前的model层,也得以精简(DAO层尽量只做最原子的数据操作,不同数据操作之间的联系,这边不考虑,那是service层的事情)。

3.service层可以实现很大程度上的代码复用,程序的功能封装更清晰了。

4.由于service层更加清晰的定义了应用程序的边界,那么对于各个service函数(对应某个服务/应用),要做到自动化测试就方便多了。WEB程序如何做到能方便的进行单元测试,这是一直困扰我的难题,这样的设计似乎真的可行了~

5.开发人员的工作分配,理论上真的可以按层次划分了。只是理论上~

同时,这样的设计模式也是存在一定的缺点的:

层次太多,刚接触的开发人员理解起来比简单的mvc结构费时;

service层的设计需要一定的功力,因为action中和model层的逻辑在很大程度上转移到这里了。

但整体上看,service Layer的引入,更加清晰的定义了应用程序的边界,提供了一系列可以重用的操作集合。这对于网站的可扩展性和可维护性是非常有帮助的。

当然,如果网站的业务逻辑并不复杂,完全没必要用这样的设计。过度设计是万恶之源~

分享到:
评论

相关推荐

    hybris Developer Training Part I - Core Platform - Module 08 - ServiceLayer

    总之,Hybris Developer Training Part I - Core Platform - Module 08 - Service Layer是针对Hybris平台开发人员提供的培训课程,旨在教授开发者如何利用Service Layer来实现业务逻辑,创建和使用服务,以及如何对...

    Python库 | servicelayer-1.9.4-py2.py3-none-any.whl

    在本例中,我们关注的是一个名为`servicelayer`的Python库,版本为1.9.4。该库通过`.whl`文件分发,这是一种Python的二进制包格式,用于简化安装过程。 `servicelayer`库专注于服务层处理,通常在后端开发中发挥...

    前端UI框架-layer-v3.1.1下载

    layer.msg('这是一个简单的提示信息'); ``` 3. **配置参数**:通过传递对象参数,可以定制弹层的样式、回调等: ```javascript layer.open({ type: 1, // 1表示普通对话框 content: '这是自定义内容', skin:...

    MVC+.Net Core+BootStrap 3 + Layer开发的 通用后台管理系统

    完全开源 **项目基于:.Net Core 2.2 运行环境:vs2017 .Net Core 2.2 前端: BootStrap 3 、 Layer 、 Jquery 后端: .NetCore 2.2 MVC

    Python库 | servicelayer-0.1.4-py2.py3-none-any.whl

    安装这个`servicelayer`库非常简单,只需要使用Python的包管理器pip,通过命令行输入: ```bash pip install servicelayer-0.1.4-py2.py3-none-any.whl ``` 这将自动处理文件的解压和安装过程。 在实际的开发环境中...

    Python库 | servicelayer-1.0.2.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:servicelayer-1.0.2.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    javamvc源码-spring-mvc-serviceLayer-javaconfiguration:嘿,我正在设法为服务层和Java配置创

    本文将深入探讨"spring-mvc-serviceLayer-javaconfiguration"项目,这是一个使用Spring MVC实现的服务层和Java配置的例子。我们将分析关键概念、设计模式以及如何通过Java配置来管理Spring组件。 首先,`service...

    layer-v3.5.1通用 Web 弹层组件

    一、使用时,请把文件夹 layer 整个放置在您站点的任何一个目录,只需引入 layer.js 即可,除 jQuery 外,其它文件无需再引入。 二、如果您的 js 引入是通过合并处理或者您不想采用layer自动获取的绝对路径,您可以...

    layer-v2.4 弹层组件

    一、使用时,请把文件夹layer整个放置在您站点的任何一个目录,只需引入layer.js即可,除jQuery外,其它文件无需再引入。 二、如果您的js引入是通过合并处理或者您不想采用layer自动获取的绝对路径,您可以通过layer...

    phone service and ril layer

    ### Phone Service 和 RIL Layer 知识点解析 #### 一、Phone Service 概述 **1.1 Phone 服务层次结构** Android 的 Phone 服务架构由多个层级组成,包括但不限于: - **App Layer(应用层):** 应用程序层,...

    前台 弹框 提示 超级好用的layer-v3.1.1

    1. **基本使用**:Layer.js 提供了一个简单的 API,可以通过 `layui.use('layer', function(){})` 引入并调用。基础弹框可以通过 `layer.open()` 方法创建,它接受一个配置对象,定义弹框的类型、内容、大小等属性。...

    layer3.5.1.rar

    《深入解析Layer 3.5.1:网络编程的核心组件》 在计算机科学与网络通信领域,Layer(层)的概念是构建复杂系统架构的关键组成部分,它遵循了分层设计原则,使得不同层次的功能独立,易于理解和维护。当我们提到...

    layer-v3.1.1

    1. 提示框:layer的提示框可以快速展示简单的信息,如操作成功或失败的提示,简洁明了,不打断用户的操作流程。 2. 信息框:用于展示详细信息,通常带有关闭按钮,用户可选择阅读后关闭。 3. 确认框:在执行关键操作...

    A lightweight SAP Business One Service Layer client for .NET.zip

    标题 "A lightweight SAP Business One Service Layer client for .NET" 提供了一个关键信息,即这是一个针对.NET平台设计的轻量级SAP Business One服务层客户端。SAP Business One是一款由SAP公司开发的企业资源...

    web弹窗插件 layer-v3.1.1

    1. 引入CSS和JS文件:将`layer.css`和`layer.js`(或压缩后的文件)引入到项目中。 2. 调用API:通过JavaScript调用`layer.open()`方法,传入配置对象以创建弹窗。 3. 关闭弹窗:可以使用`layer.close()`方法关闭...

    layer-v3.0.1web弹层组件

    《layer-v3.0.1:Web弹层组件深度解析》 在Web开发中,弹层组件是不可或缺的一部分,它们通常用于提示信息、展示对话框、进行用户交互等。layer是一款广泛使用的JavaScript弹层插件,尤其在版本v3.0.1中,其功能...

    Laravel开发-laravel-service-layer

    在Laravel框架中,服务层(Service Layer)是一种设计模式,用于将业务逻辑与控制器、模型和视图等其他组件分离,以实现更清晰的代码结构和更好的可维护性。这个压缩包“laravel-service-layer-master”很可能包含了...

    layer最新版本兼容IE8

    通常,开发者只需要将下载的Layer文件包解压,将包含的JavaScript和CSS文件引入到HTML页面中,通过简单的API调用就能创建各种弹出层效果。这种低门槛的使用方式使得Layer成为许多开发者的首选。 在文件列表中只给出...

    layer弹窗:top.layer弹窗到父页面跨域解决办法

    在IT行业中,跨域问题是一个常见的挑战,尤其是在网页开发中,比如当我们在使用layer弹窗插件时,可能会遇到从子页面弹出一个窗口到父页面的情况。标题和描述所提及的是一个关于如何解决layer弹窗在跨域环境下的问题...

Global site tag (gtag.js) - Google Analytics