新定义三层,指挥官模式

一、概念

1、三层:

表示层及UI层: 主要是页面显示与控制操作

业务层:业务逻辑的处理

数据访问层:封装了对数据库的增、删、查和改操作。

为什么三层这么好用

原因是他的结构体系非常的清晰易懂,从功能与实现方面进行了层次划分,实现了高内聚和低耦合。

我们项目最常用结构体系就是在三层的基础加上一个通用层(Common)、第三方接口或者工具层等,方便对一些公用的东西和特殊性的东西进行分类。

至今为止这个结构体系依然是最好用的项目结构体系。

2、指挥官模式:

传统的三层架构

传统的三层架构是不允许跨层调用的 ,也就是说指挥官是UI层

缺点:

1、来回切换

指挥官只能指挥业务层并不能知道数据层在做什么,这就意味着我们在写代码的时候需要看2层才能看清晰这个功能具体做了些什么,在编码过程中就需要频繁的来回切换。

2、浪费

很多时候指挥官只需要直接传达给数据层,现在只能强制传达给业务层,然后在通过业务层转达给数据层

3、写好业务层有难度

为什么说写好这个业务层有难度,也许是大家很疑惑的一件事情下面我就举例子讲解

现实案例:

很多人工作二三年都认为业务层是多余的不方便,不加又不合适,写着写着指挥官就直接调数据层了。

解答案例:

原因是业务层受到了限制,UI层的所有东西不能使用,但是又要把非UI部分进行逻辑分离,在这种情况下 业务层本能发挥100%实力,现在就只能发挥70%。

正是这种原因好多的逻辑都写在了指挥官层(UI层),业务层就是个空架子,只有指挥官层(UI层)东西太多时才交给业务层处理,有经验的程序员才能够真正的把UI层和业务层的东西划分清楚,大大提高了分层难度。

指挥官重定义三层

指挥官模式是将权力全部掌控在自已手上,只做我能做和我想做的事情。

指挥官是用来把控全局的  技术活他做不了(数据访问层),体力活他做不了(包外层)。

优点:也就是解决了传统三层的3个缺点

1、指挥官层就能看透一切,并且没有冗余代码

2、减少不必要的开销,指挥官可以直接向数据层下达指令

3、分层更加清晰,指挥官层只做我想做的事情,不想做的事情直接外包,不能做的事情只能找数据层。

二、基于 ASP.NET MVC +IOC+ SqlSugar.ORM+语法糖.dll实践指挥官模式

DEMO地址:

https://github.com/sunkaixuan/ASPNETMVCCRUDDEMO

1、创建项目:

新建MVC4项目,全部默认删掉没用的文件夹和文件

2、nuget引用dll:

我们使用的ORM为SqlSugar,语法糖框架 SyntacticSugar.dll 主要封装了一些常用函数

3、目录结构

每个控制器都用一个pack文件夹包着 例如homeController为指挥官层,homeController里面不想处理的事情都交给Outsourcing文件,

控制器不能处理的事情通过一个DbService.Command把 DAO层打通

从上图可以看出DAO层已经精简到只有三个文件,是的只要这三个文件及可。

如果需要一些通用数据服务可以对DB对象进行一层封装

控制器代码:

  public class ListController : Controller
    {
        private DbService _service;
        public ListController(DbService service)
        {
            _service = service;
        }

        public ActionResult Index(string title, int pageIndex = 1, int pageSize = 5)
        {
            var model = new ResultModel<string, List<dnt_test_topics>, HtmlString, List<dnt_test_forums>>();
            _service.Command<Outsourcing>((db, o) =>
            {
                model.ResultInfo = "增删查改";
                var queryable = o.GetQueryable(title);//处理查询逻辑
                queryable.DB = db;//设置连接对象
                int pageCount = queryable.Count();
                model.ResultInfo2 = queryable.ToPageList(pageIndex, pageSize);
                model.ResultInfo3 = o.GetPageString(pageIndex, pageSize, pageCount);//获取分页字符串
                model.ResultInfo4 = db.Queryable<dnt_test_forums>().ToList();//编辑用到的分类下拉列表
            });
            return View(model);
        }

        public JsonResult Delete(int id)
        {
            ResultModel<dynamic> model = new ResultModel<dynamic>();
            _service.Command<Outsourcing>((db, o) =>
            {
                model.IsSuccess = model.ResultInfo = db.Delete<dnt_test_topics, int>(id);
                //减少了2个类的冗余代码,这就是和传统三层最大区别
            });
            return Json(model, JsonRequestBehavior.AllowGet);
        }

        public JsonResult GetById(int id)
        {
            ResultModel<dynamic> model = new ResultModel<dynamic>();
            _service.Command<Outsourcing>((db, o) =>
            {
                model.ResultInfo = db.Queryable<dnt_test_topics>().Single(it => it.tid == id);
                model.IsSuccess = true;
            });
            return Json(model, JsonRequestBehavior.AllowGet);
        }

        public JsonResult Insert(dnt_test_topics obj)
        {
            ResultModel<dynamic> model = new ResultModel<dynamic>();
            _service.Command<Outsourcing>((db, o) =>
            {
                obj.postdatetime = DateTime.Now;
                obj.lastpost = DateTime.Now;
                obj.lastposter=obj.poster = "管理员";
                model.ResultInfo = db.Insert(obj);
                model.IsSuccess = true;

            });
            return Json(model, JsonRequestBehavior.AllowGet);
        }

        public JsonResult Update(dnt_test_topics obj)
        {
            ResultModel<dynamic> model = new ResultModel<dynamic>();
            _service.Command<Outsourcing>((db, o) =>
            {
                model.IsSuccess = model.ResultInfo = db.Update<dnt_test_topics>(
                    new { title = obj.title, fid = obj.fid }
                    , it => it.tid == obj.tid);

            });
            return Json(model, JsonRequestBehavior.AllowGet);
        }
    }

三、总结

一切从简,没有冗余代,这个是我工作多年总结出的最偷懒写法,但不能保证每个人都喜欢,喜欢的就给个赞。

DEMO地址:

https://github.com/sunkaixuan/ASPNETMVCCRUDDEMO

时间: 2024-10-13 00:41:33

新定义三层,指挥官模式的相关文章

CRM项目开发流程:采用《三层架构模式》

采用<三层架构模式> 1.根据顾客的需求设计数据表格,明确表之间的关联,建好约束 2.实体Bean的设计(一个表对应一个实体) 3.业务层设计(一个实体类一个业务接口,一次提交一个业务方法) 4.持久层设计(一个实体类一个持久接口,一次数据操作一个持久方法) 一.数据库表的建立: 建表时要注意表与表之间的联系,明确哪些是主键,哪些是外键,建立好约束. 要求数据添加合理,添加记录数量也要适当的多点,不然直接会影响后期持久层和业务层方法的调试,从而影响整个项目的开发. 表的列名要求命名规范,便于理

为新定义的Web服务器添加应用Web模块并测试集群

为新定义的Web服务器添加应用Web模块并测试集群 1.选择要部署的Web应用,点击 2.选择管理模块 3.选择应用,和要部署的Web服务器,选好后,点击应用. 4.点击保存设置 新应用web应用模块部署到web服务器后,需要重新为web服务器plugins插件生成新的插件配置文件.并传播或拷贝到HTTP   Server  所在机器及其对应的目录中.让HTTP Server插件重新加载更改的配置信息.为新部署的应用生成请求路由信息,从而能请求到正确的服务器成员和Web应用模块,操作如下 生成插

新媒体的营销模式

基于新媒体的营销模式,则是将propaganda向involvement(参与度)改变.新媒体营销借助于新媒体中的受众广泛且深入的信息发布,达到让他们卷入具体的营销活动中. 新媒体营销的渠道,或称新媒体营销的平台,主要包括但不限于:门户.搜索引擎.微博.微信.SNS.博客.播客.BBS.RSS.WIKI.手机.移动设备.APP等.新媒体营销并不是单一地通过上面的渠道中的一种进行营销,而是需要多种渠道整合营销,甚至在营销资金充裕的情况下,可以与传统媒介营销相结合,形成全方位立体式营销. 据说搜狐新

Android4.4新特性 沉浸式模式

网上关于Android的沉浸模式,大多数讲的是状态栏与导航栏的透明与融合.查阅了一些资料以后,我想写一篇文章讲述一下沉浸模式的定义到底是什么? 参考资料:https://www.zhihu.com/question/24908570 <iPhone 人机界面指南>时经常出现一个词:“沉浸式程序”,从心理学角度来看,“沉浸”就是让人专注在当前的目标(由设计者营造)情境下感到愉悦和满足,而忘记真实世界的情境.实际上,从采取扁平化设计的iOS 7开始,苹果就开始采用了沉浸式程序的界面展示. 作为An

一种在旧代码上增加新需求的重构模式

应用场景 相信大家遇到过这种场景:旧代码中已经有一堆的if-else或者switch-case了:产品却要求在这段流程里增加一个新的功能. 这种时候大家会怎么做?我的建议是: 重构这段代码.在重构的基础上,加入新的功能. 肯定会有人说: 工期本来紧张,再对原有代码进行重构,岂不会更加捉襟见肘? 这里介绍的(也是我在实践中经常使用的)这种方式,我称之为"接口-分发器模式".它可以在尽量减少重构工作量的同时,完成大部分重构工作. 类图 接口-分发器类图 接口 这个模式首先将旧代码/功能抽取

ExtJS4 便捷三层开发模式

自定义类已经不是ext4.x一个新特性,但与ext3.x的自定义类有语法上的区别.将相关模块封装成类可以有效的减少浏览器的压力,提高渲染速度,同时抽象每一个可重用方法,减少代码复杂度和重复. 特定命名规范类开发,各个模块可以相对独立的设计和发展, 可以进行并行设计.开发和并行试验,提高开发效率和减少出错的机率. 前段时间有幸接触某一大型项目,整个实验室全体人员开发,10月启动项目,参与前端开发已有11人.本文档旨在指引Ext JS 4类创建和规范项目开发中类创建. 项目代码拆分和组织方式: Ex

基于SSM的POI导入导出Excel实战尾篇-其余功能实战(mvc三层开发模式体验)

业务需求:前几篇基本已经介绍完毕项目的核心功能,即POI导入导出Excel,为了整个项目的完整性,并让诸位童鞋体验体验企业级javaweb应用mvc三层模式的开发流程,本文将介绍一下项目的其余功能,包括搜索,新增,修改,删除 需求分析:作为程序员,在项目中经常接触的就是CRUD了,本篇博文将整合jquery-easyui框架(版本采用1.5.5.4)异步实现上述几个功能,给项目画上一个完整的句号!当然啦,在刚开始开发时,对于自己开发好的后端接口完全可以用Postman进行模拟(我就是这样做的),

MVC三层架构模式编程思想 JSP-Servlet-JavaBean

MVC(Mdodel-View-Controller)编程模式,把一个Java应用分成三层:模型层.视图层.控制层,各层分别实现各层的功能,整个过程见下图就一目了然了. JSP.JavaBean.Servlet三层架构即MVC编程模式是现在我们学习web应用编程的基础思想,上图是经本人总结后做出的图,有不对的地方望各位朋友多提意见.

.Net普通三层-&gt;工厂模式-&gt;线程内唯一+单元工作模式-&gt;WebService分布式三层

在软件世界分层的思想无处不在 主要是为了提高软件系统的维护性,扩展性,复用性和解耦等 软件的三层构架是一种最基本的分层思想的体现 结构图大体如下: 如此一来,开发人员可以只关注其中一层,而无需关心下一层是如何实现的 但是最基本的三层构架在软件系统中很明显是不够用的 因为它带来优点的同时也带着许多缺点,比如耦合性高,经常出现修改某一层的代码另外一层也要随之大幅度整顿 而且当需求发生改变的时候,如:原先开发的时候使用mssql数据库,而现在又要求更换成mysql数据库 更换Dal层会导致Bll层也要