精简的程度

  1. ViewModel精简
  2. 服务精简
  3. 控制器精简
  4. Index.cshmtl精简
  5. AddOrEdit.cshtml精简

效果:最精简的情况下,只需要写Entity这一个数据库实体然后加上一些简单标记即可, 一般情况也只需要写TSearch,TOrder的逻辑可以

ViewModel精简

  • 首先明确,因为Entity是codefirst生成数据库的前提,所以这个是必须有的。但是很多情况下 ViewModel和Entity属性一样,这个时候我们可以无需创建ViewModel,让Entity继承自IViewModel 即可将ViewModel精简掉。
  • 注意服务中Convert方法不能去掉,由于ef代理对象的存在,直接暴露代理对象到界面层, 如果界面层修改代理对象,并且调用了工作单元的提交,那么实体就会被更新。也许这个bug你会找很久 ,所以Convert方法必须保留

服务的精简

  • 第一步我们将Curd服务上的abstract去掉,
  • 假设我们知道TEntiy,TModel,TOrder,TSearch的类型就可以通过反射创建出Crud服务了, 那么我们需要将上面四个泛型类型绑定到一起即可,我们可以定义一个类CrudCoden,这个类包含四个 属性,属性的类型都是Type,作用就是用来标识这四个泛型类型.
  • 我们设计一个函数,入参是CurdCoden,出参是Curd服务的类型和Curd服务接口类型.通过反射即可构造
  • 填充CrudCoden,我们将CrudCoden继承自Attribute,然后给出构造函数传入 TOrder,TModel,TEntity,TSearch,可以重载多个,这样直接标记在TEntity上即可完成CrudCoden的构造
  • 注册服务 跟Repository的构造类似,反射程序集,然后获取所有的CurdCodenAttribute,然后 之前的函数获取Crud服务类型和接口类型,然后用Ioc注册即可,。

控制器的精简

  • 控制器的注册和Crud服务类似,只是这个不需要接口
  • 控制器激活,假设前台传入的url为user/index这种,这时,我们可以拿到controller的类型为user 然后通过反射获取到Entity的类型,这样就可以拿到Crud控制器类型,即可激活控制器
  • 注意Url的配置,之前因为定义了Controller的类型,mvc会默认采用{名称}Controller中名称 作为Url中Controller部分的惨呼声,那么在配置url的时候,我们这里默认就采用Entity的名字显式 指定为Contoller参数

Index.cshtml精简

  • Controller的返回不在直接是View()这样,我们显式指定未Shared的Index.cshtml页面, 然后页面的Model为dynamic,然后在querysection部分直接Html.EditForModel()即可
  • Crud这些按钮也不是都需要,同样通过标记,在Entity上给出自定义Attribute,配置那些功能, 然后在页面上反射获取,如果没有标记,默认为全部.

AddOrEdit.cshtml精简

这里精简和Index.cshtml中类似,指定到特定页面,用dynamic传递模型,用EditForModel生成页面

菜单

这里同样可以通过标识,标识这个实体的Crud可以挂在那个菜单相面,在初始化的时候直接读取 标记即可

几个过程

程序启动过程

  1. 反射初始化菜单
  2. 注册Repository
  3. 注册服务
  4. 注册控制器

菜单点击过程

  1. 解析出Url中Controller对应的那个Entity,
  2. 用IocResolve出Controller,由于使用Ioc,只要构造过类型就可以递归创建
  3. 执行Action返回index.html页面
  4. 获取Entity上操作配置,生成页面返回到浏览器
  5. 调用Html.EditForModel生成页面
  6. Js调用查询方法获取数据

按钮点击过程

  1. 解析出Url中Controller对应的那个Entity,
  2. 用Ioc解析出Controller,由于使用Ioc,只要构造过类型就可以递归创建
  3. 执行Action返回操作页面
  4. 调用Html.EditForModel生成页面
  5. 提交数据(这里默认提交到当前url)
  6. 重复上述1,2两步,然后提交数据

GetFilter和GetOrder

这两部分需要扩展到TSearch和TOrder的类中即可,并且在SearchBase和OrderBase中声明 虚方法,给出默认实现和Crud服务中一样,然后子类实现

注意

  • 这种精简模式并不和之前的冲突,如果有显式实现的Curd服务和控制器则使用精简模式。
  • TModel的精简可根据情况使用
  • 为了性能考虑,请多做一些缓存
  • 精简模式下,其实TModel搭配attribute可以更灵活的实现编辑页面,吧Html.EditForModel 重写掉可以更大程度的是编辑页面灵活

总结

上面已经把实现要做的所有细节都说清楚了,只要按照说明写代码实现即可,最难也就是反射 和attribute的运用了,这两个使用是程序员进阶的必经之路,所以还是必须会的。由于这个设计 其实是一个反模式,太过于集中并且太依赖于配置,调试也相对麻烦。 但是他有一个好处就是帮你少写代码,有时候为了少写些代码很多事情都是值得去尝试的。 如果实现起来遇到什么麻烦,请留言我会一一解答。 代码根本没有思想重要。思想都不重视,代码只是复制粘贴而已。

CRUD全栈式编程架构之更精简的设计的更多相关文章

  1. CRUD全栈式编程架构之导入导出的设计

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  2. CRUD全栈式编程架构之MVC的扩展设计

    MVC执行流程 路由的扩展 我理解的路由作用有以下几个 Seo优化,用“/”分开的url爬虫更爱吃 物理和逻辑文件分离,url不再按照文件路径映射 Controller,Action的选择 MVC路由 ...

  3. CRUD全栈式编程架构之数据层的设计

    CodeFirst 一直以来我们写应用的时候首先都是创建数据库 终于在orm支持codefirst之后,我们可以先建模. 通过模型去创建数据库,并且基于codefirst可以实现方便的 实现数据库迁移 ...

  4. CRUD全栈式编程架构之界面层的设计

    Layout的设计 模板模式 mvc的模板特别类似设计模式中模板方法模式,结合Layout中RenderSection和RenderBody方法可以将部分html展现逻辑延迟到具体的视图页面去实现里面 ...

  5. CRUD全栈式编程架构之服务层的设计

    服务层代码 首先我先放出2个主要类的代码再分别讲解 接口 using System; using System.Collections.Generic; using System.Linq; usin ...

  6. CRUD全栈式编程架构之控制器的设计

    页面 这里界面我采用jquery miniui来做的,当你完全了解了整个设计之后可以轻松切换到其他的js框架,个人认为类似muniui,easyui等等这类可以将web界面做得和winform类似的框 ...

  7. CRUD全栈式编程架构总结

    这里放出实例代码 github.com/SkyvenXiong/HCC

  8. CRUD全栈式编程概述

    业务场景 CRUD,从数据驱动的角度几乎所有的的业务都是在做这样的事情.  几乎所有的操作都是在做对表的增删改查.  假设我们将数据库数据规个类:  分为基础/配置数据和业务/增长数据,或者说静态数据 ...

  9. 全栈式JavaScript

    如今,在创建一个Web应用的过程中,你需要做出许多架构方面的决策.当然,你会希望做的每一个决定都是正确的:你想要使用能够快速开发的技术,支持持续的迭代,最高的工作效率,迅速,健壮性强.你想要精益求精并 ...

随机推荐

  1. 精简的网站reset和css通用样式库

    一.CSS reset body{ line-height:1.4; color:#; font-family:arial; font-size: 12px; } input,textarea,sel ...

  2. TreeMap读源码总结

    红黑树: 定义 A red–black tree is a kind of self-balancing binary search tree in computer science. Each no ...

  3. 移动性能测试 | 持续集成中的 Android 稳定性测试

    前言 谈到Android稳定测试,大多数会联想到使用monkey工具来做测试.google官方提供了monkey工具,可以很快速点击被应用,之前我有一篇帖子提到了monkey工具的使用,详见: htt ...

  4. Query获取多种input值的方法

    1 if($("input[name=item][value='val']").attr('checked')==true) //判断是否已经打勾 name即控件name属性,va ...

  5. asp.net模板页实现类似jquery中document.ready

    模板页先判断是否有方法DocumentReady,有的话就调用 1.模板页 <script type="text/javascript" language="jav ...

  6. python3 提取http请求response中的某个值

    在使用python3 request做接口测试的时候,想获取response的json中的某个值做断言时,发现request好像没有相关的方法 所以只好自己找写一个了.在我看来,json就是一个字典, ...

  7. 4.centos7 docker 安装

    参考这个文档进行安装docker: http://www.runoob.com/docker/centos-docker-install.html 开机启动 systemctl enable dock ...

  8. vue入门----------路由配置

    在使用脚手架搭建好项目后要配置路由 1.首先要安装vue-router,你可以在项目的package.json文件中的dependencies项目中添加"vue-route": & ...

  9. 【ACM】N皇后问题

    N皇后问题 #include <iostream> #include <cmath> using namespace std; ; //判断当前位置的皇后加入是否成立 bool ...

  10. RTT设备与驱动之硬件定时器

    硬件定时器可以对外部时钟进行计数,利用内部时钟进行定时. 函数 描述 rt_device_t rt_device_find(const char* name); 查找定时器设备 rt_err_t rt ...