在继续学习Model的实践经验之前,先思考一下Controller和View的实践原则在本次系统重构中的应用,我手上是一个后台管理系统(不是门户系统、不是具体业务系统),通俗点讲就是给企业的运维人员用的一套系统。

后台运维系统最核心的就是导航菜单,一切工作从导航菜单开始,从UI结构上来讲就是典型的左右结构(左边导航右边操作区域),主流的Web UI框架都有这种结构的Layout。再深入一层的核心是资源(这个不具备通用性,只是我手上现有系统的设计理念而已):导航菜单是资源,企业组织结构是资源,用户是资源,权限是对资源的权限.....

粗略分析一下资源的获取流程及业务规则:

  1. 获取客户端参数,具体规则:参数可能是指定某类型的资源,也可能是指定某个具体的资源
  2. 根据参数找到所需要的资源,具体规则:根据参数从Model中获取数据,当然数据经过了权限过滤
  3. 返回给客户端

针对这种情况,相关的Controller的组织方案有很多:

  • 不同类型的资源建立不同的Controller,在View中需要导航菜单的地方呼叫导航菜单的Controller,在View中需要组织结构的地方呼叫组织结构的Controller...
  • 在单个Controller中通过不同的Action来处理不同类型的资源的访问。创建ResourceController,在其中创建CreateNavMenu、CreateUser、CreateOU等Action
  • 在单个Controller中通过同一个Action来处理不同类型的资源的访问。在ResourceController中用一个名称为Create的Action来处理不同类型的资源的添加操作

后面两种方案尽管将业务流程放入Controller中,而业务流程中的具体业务规则放入Model中,但由于本系统中资源的类型是动态的,这两种方法会让Controller和View越来越不轻巧,或者Action个数越来越难以控制,或者Action内部的逻辑代码越来越复杂。第一种方案将业务流程实际上分散在"组织"(这里当动词用,即增加一种类型的资源时,要增加对应的Controller)中了,当资源的类型越来越多时,只要遵循这个"分散的规则"就可以优雅的增加新的功能,这不会减少代码量的增加,但能持续保持代码结构的清晰(这是从"管理"的角度来看这个结论而不是技术实现角度,对我的重构目标是合适的,如果你看到这篇文章,注意不要对你造成误导)。

因此建立以下区域规则:

创建名称为Core的区域,用来组织纯粹的系统自身管理的Controller和View。本系统中后台管理的基础是资源,所以会有一个名称为ResourceController的控制器,

因为是后台管理,从UI结构上来讲重构后还是典型的左右结构(左边导航右边操作区域),主流的Web UI框架都有这种结构的Layout,从这个角度出发,第一个Controller是导航菜单(定名为NavMenuController),这个Controller就是单纯的返回Json类型的导航菜单数据,通过JQuery在View中接收并显示。然后会有身份验证及授权两个Controller,

Microsoft 2013 新技术学习笔记 四的更多相关文章

  1. Microsoft 2013 新技术学习笔记 一

    有几年没有关注技术了,最近有点时间想把技术重新捡起来,借着重构手上的一个后台管理框架的机会将微软新的几种技术全部应用一下,从目的上来讲并没有希望能对涉及的技术有很深入的了解,所以这个系列的文章(篇幅不 ...

  2. Microsoft 2013 新技术学习笔记 三

    什么是代码结构的组织?asp.net MVC 5 默认创建出的几个目录的标准含义分别如下: Controllers目录存放MVC模式中的Controler Models目录存放MVC模式中的Model ...

  3. Microsoft 2013 新技术学习笔记 二

    在探讨系统重构的代码结构组织之前,先初步考虑框架与数据库的交互,在.net平台上数据访问方案有人总结为三类:DataSet.ADO.net 2.0.ORM组件.我只熟悉ADO.NET方式,众多的企业特 ...

  4. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  5. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  6. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  7. Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  8. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  9. ES6学习笔记<四> default、rest、Multi-line Strings

    default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...

随机推荐

  1. SharePoint API如何处理时区问题

    使用SharePoint API,我们经常会有时区转换的问题,SharePoint API 本身如何处理时区问题的呢? 本文主要以Modified字段为例测试相关API的行为. CSOM API测试: ...

  2. 基本hibernate DEMO

    Hibernate常用API: 1Configuration: 负责加载主配置文件信息,同时也加载映射关系文件信息. 2SessionFactory 负责创建Session对象. 3Session 数 ...

  3. RequireJS源码初探

    前两天跟着叶小钗的博客,看了下RequireJS的源码,大体了解了其中的执行过程.不过在何时进行依赖项的加载,以及具体的代码在何处执行,还没有搞透彻,奈何能力不够,只能先记录一下了. RequireJ ...

  4. paip.ikanalyzer 重加载词库的方法.

    paip.ikanalyzer 重加载词库的方法. 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn ...

  5. JS 基本数据类型

    一.undefined 类型 (ECMAScript 3引入undefined类型) 1.它的值只有一个 undefined 2.未初始化的变量 会隐式转换为undeFined类型 var box; ...

  6. 搭建windows的solr6服务器(二)

    首先搭建solr环境,如:solr6.0学习(一)环境搭建 修改各种配置文件. 1.修改solrhome下的solr.xml文件 注解掉zookeeper搭建集群配置,我们后面会采用master-sl ...

  7. Docker实践(1)—入门

    tutorial centos6.5环境. # yum install docker-io -y 会依赖安装libcgroup,lxc,lxc-libs 启动docker # service dock ...

  8. RPC和NFS

    参考:http://eduunix.ccut.edu.cn/index2/html/linux/OReilly.SUSE.Linux.Jul.2006/059610183X/suselinux-CHP ...

  9. BarManager.ContextMenu

    <!--Search & List Area--> <dxb:BarManager Name="barManager1" dxlc:DockLayoutC ...

  10. Sql server Always On 读写分离配置方法

    使用了Sqlserver 2012 Always on技术后,假如采用的配置是默认配置,会出现Primary server CPU很高的情况发生,比如默认配置如下: 需要自定义来解决这个问题. 我们先 ...