前言:在两年前(最初发布时间:2013年1月9日(csdn),当前文章时间2015年11月10日),项目组推出了基于Dapper,Mvc和WebApi的快速开发框架,随着后续Slickflow产品的实践和应用,今再次对SlickOne项目做以回顾和总结。其目的是精简,持续改进,保持重构,让开发人员了解到最新的变化,尤其是全栈开发人员做以参考。

两年之前的博客文章可以查阅(最初发布时间:2013年1月9日):

http://blog.csdn.net/besley/article/details/8479943

1. 新版本变化综述:

1) Dapper部分的变化:

Dapper本身有支持对数据库底层接口,此次主要是增加了Oracle和MySQL数据库的接口,也修改了Dapper里面的SqlMapper文件。

2) SlickOne.Data 数据访问

在泛型封装的基础上,提供了列表分页,新增主键ID返回,根据多ID值查询返回列表,新增查询功能的存储过程等接口。

3) Mvc/WebApi

将两个类型的项目动态库文件整合在一个Web项目里面,同时响应页面请求和Api请求。

4) Web前端

由JQueryUI 转换到 Bootstrap框架,核心组件SlickGrid 转换为Bootstrap样式。

2. 框架设计

1) 数据访问Repository泛型类

Repository泛型类,彻底实现数据快速访问,不用重复编写不同实体的通用基本方法;而且此泛型类的存在也用以支持Dapper,EF,Heibernate等各种数据访问框架,考虑到不同用户的技术储备,只要去实现IRepository的接口方法就可以继续使用自己喜欢的框架。

2) 基于简单实体访问

简单实体,原始来源为数据库表的对应实体,而且并限定为只包含属性字段。在早期版本区分了数据实体和业务实体,有AutoMapper的转换工具,在新版本里面,不再强调业务实体,而是统一命名为简单实体,始终根据简单实体做业务功能开发,做数据的存储和读取。

3) 接口定义优先策略

接口方法更加侧重于业务过程的定义。基本方法如新增,编辑和删除可以直接快速调用Repository里的泛型方法,不再默认自动生成Partial文件去维护,包括Interface, Service类和ApiController类都不再生成Partial类文件。

4) WebApi 接口封装

消息体引用ResponseResult泛型类,包括状态(Status),消息(Message)和实体(Entity)关键属性。ResponseResult类用于服务端到前端的数据和消息封装,消息内容格式是JSON数据格式。

5) Javascript模板引擎

采用前端Javascript模板引擎,解析WebApi传递回的JSON对象,做前端界面展现。模板引擎可以采用HandlebarsJS或DustJS。也可以选择其它模板引擎。

6) Bootstrap 

前端框架过渡到Bootstrap框架,相应的控件,如SlickGrid和ZTree等控件都可以找到对应Bootstrap的样式版本。

3. 解决方案结构图示

4. 项目代码实例

 1) 实体对象

  1. /// <summary>
  2. /// 产品实体对象
  3. /// </summary>
  4. [Table("PrdProduct")]
  5. public class ProductEntity
  6. {
  7. public int ID { get; set; }
  8. public string ProductName { get; set; }
  9. public string ProductCode { get; set; }
  10. public string ProductType { get; set; }
  11. public Nullable<decimal> UnitPrice { get; set; }
  12. public string Notes { get; set; }
  13. }

2) 接口定义

  1. /// <summary>
  2. /// 产品服务接口
  3. /// </summary>
  4. public interface IProductService
  5. {
  6. List<ProductEntity> GetProductList();
  7. }

3) 服务实现

  1. /// <summary>
  2. /// 获取列表数据(示例查询方法,实际会用到分页,此处用于演示。)
  3. /// </summary>
  4. /// <returns></returns>
  5. public List<ProductEntity> GetProductList()
  6. {
  7. var sql = @"SELECT ID,
  8. ProductName,
  9. ProductCode,
  10. ProductType,
  11. UnitPrice,
  12. CreatedDate
  13. FROM PrdProduct";
  14. var list = QuickReporsitory.Query<ProductEntity>(sql, null)
  15. .ToList();
  16. return list;
  17. }

4) WebApi

  1. /// <summary>
  2. /// 获取产品列表
  3. /// </summary>
  4. /// <returns></returns>
  5. [HttpGet]
  6. public ResponseResult<List<ProductEntity>> GetProductList()
  7. {
  8. var result = ResponseResult<List<ProductEntity>>.Default();
  9. try
  10. {
  11. var list = ProductService.GetProductList();
  12. result = ResponseResult<List<ProductEntity>>.Success(list);
  13. }
  14. catch (System.Exception ex)
  15. {
  16. result = ResponseResult<List<ProductEntity>>.Error(
  17. string.Format("读取{0}数据失败, 错误:{1}", "产品列表", ex.Message)
  18. );
  19. }
  20. return result;
  21. }

5) 前端脚本

  1. productlist.load = function () {
  2. jshelper.ajaxGet("/soneweb/api/product/GetProductList", null, function (result) {
  3. if (result.Status == 1) {
  4. var columnProduct = [
  5. { id: "ID", name: "ID", field: "ID", width: 40, cssClass: "bg-gray" },
  6. { id: "ProductName", name: "名称", field: "ProductName", width: 120, cssClass: "bg-gray" },
  7. { id: "ProductCode", name: "编码", field: "ProductCode", width: 120, cssClass: "bg-gray" },
  8. { id: "ProductType", name: "类型", field: "ProductType", width: 160, cssClass: "bg-gray" },
  9. { id: "UnitPrice", name: "单价", field: "UnitPrice", width: 160, cssClass: "bg-gray" },
  10. { id: "CreatedDate", name: "创建时间", field: "CreatedDate", width: 200, cssClass: "bg-gray", formatter: datetimeFormatter },
  11. ];
  12.  
  13. var optionsProduct = {
  14. editable: true,
  15. enableCellNavigation: true,
  16. enableColumnReorder: true,
  17. asyncEditorLoading: true,
  18. forceFitColumns: false,
  19. topPanelHeight: 25
  20. };
  21.  
  22. var dsProduct = result.Entity;
  23. var dvProduct = new Slick.Data.DataView({ inlineFilters: true });
  24. var gridProduct = new Slick.Grid("#myProductGrid", dvProduct, columnProduct, optionsProduct);
  25.  
  26. dvProduct.onRowsChanged.subscribe(function (e, args) {
  27. gridProduct.invalidateRows(args.rows);
  28. gridProduct.render();
  29.  
  30. });
  31.  
  32. dvProduct.onRowCountChanged.subscribe(function (e, args) {
  33. gridProduct.updateRowCount();
  34. gridProduct.render();
  35. });
  36.  
  37. dvProduct.beginUpdate();
  38. dvProduct.setItems(dsProduct, "ID");
  39. gridProduct.setSelectionModel(new Slick.RowSelectionModel());
  40. dvProduct.endUpdate();
  41.  
  42. gridProduct.onSelectedRowsChanged.subscribe(function (e, args) {
  43. var selectionRowIndex = args.rows[0];
  44. var row = dvProduct.getItemByIdx(selectionRowIndex);
  45.  
  46. if (row) {
  47. productlist.mselectedProductID = row.ID;
  48. productlist.mselectedProductRow = row;
  49. }
  50. });
  51. };
  52. });
  53.  
  54. function datetimeFormatter(row, cell, value, columnDef, dataContext) {
  55. if (value != null && value != "") {
  56. return value.substring(0, 10);
  57. }
  58. }
  59. }

6) 页面呈现

5. 项目应用场景

SlickOne适用于BS/CS等架构的系统,目前已经用于Web网站项目,电商ERP,OA,工作流和App等各种类型的系统。

6. 项目资源

SlickOne项目开源地址:

http://github.com/besley/slickone

(包含数据库脚本文件)

SlickOne 做框架基础的权限管理:

http://github.com/besley/slicksafe

SlickSafe 权限管理在线DEMO:

http://demo.slickflow.com/ssweb/

7. 特别致谢

感谢随风,青文等网友对项目代码的贡献,开源能让大家集体参与,能让更多人分享代码成果。

8. 培训及技术支持

为团队开发人员快速上手,Slickflow项目组提供线上开发框架架构设计培训,流程引擎培训,SlickGrid插件开发培训等服务,欢迎留言或咨询。

9. 在线QQ交流群

QQ群: 151650479

SlickOne敏捷开发框架介绍(一) -- 基于Dapper, Mvc和WebAPI 的快速开发框架的更多相关文章

  1. SlickOne -- 基于Dapper, Mvc和WebAPI 的快速开发框架

    前言:在两年前,项目组推出了基于Dapper,Mvc和WebApi的快速开发框架,随着后续Slickflow产品的实践和应用,今再次对SlickOne项目做以回顾和总结.其目的是精简,持续改进,保持重 ...

  2. 我和小美的撸码日记--基于MVC+Jqgrid的.Net快速开发框架

    前言:以前的帐号没有发首页的权限,特此把这篇文章从另外一个博客移过来,这篇是<我和小美的撸码日记>的序 一转眼务农6年了,呆过大公司也去过小作坊,码农的人生除了抠腚还是抠腚.在所有呆过的公 ...

  3. c# 基于WebApi的快速开发框架FastFramework

    一.框架简介 此框架是针对于webapi进行开发,项目分层是基于ABP框架的分层,更好的抽离业务逻辑关系,ABP是基于EF做数据访问层,本人个人比较喜欢Dapper,就把数据访问层封装成了Dapper ...

  4. Rookey.Frame企业级快速开发框架开源了

    Rookey.Frame是一套基于.NET MVC + easyui的企业级极速开发框架,支持简单逻辑模块零代码编程.支持工作流(BPM).支持二次开发,具有高扩展性.高复用性.高伸缩性:应广大网友要 ...

  5. SlickOne 敏捷开发框架介绍(二) -- 多用户/多租户/SAAS软件基础框架实现

    前言:在应用于集团版客户或SAAS平台服务的业务系统中,流程管理系统需要支持多用户组织模型.其中包括角色数据.流程定义数据和流程实例数据的多用户标识绑定.本文旨在全面描述如何基于SlickOne敏捷开 ...

  6. 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二)

    基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二) 之前文章中给大家说明了下我这个小小的想法,发现还是有不少人的支持和关注.你们的鼓励是对我最大的支持. 我总结了了 ...

  7. 快速开发框架,及库存管理系统,基于easyui框架和C#语言MVC、EntityFrameWork、T4模板技术。

    快速开发框架,及库存管理系统,基于easyui框架和C#语言MVC.EntityFrameWork.T4模板技术. 产品界面如下图所示: 源码结构: 开放全部源码,如有需要请联系,QQ:1107141 ...

  8. Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍

    Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍 spring集成 mybatis Spring4.x零配置框架搭建 两年前一直在做后 ...

  9. 基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体之基础介绍

    LnskyDB LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼. 文档地址: https://lining ...

随机推荐

  1. 2013 NEERC

    2013 NEERC Problem A. ASCII Puzzle 题目描述:完成一个拼图. solution 暴搜,但好像挺难打的,但听说因为题目限制比较多,其实很多奇怪的情况都不存在. Prob ...

  2. 使用IDEA进行打包

    使用IDEA打jar包: 1.

  3. 使用免安装压缩包安装MySQL

    OS:Windows 10家庭中文版 MySQL:mysql-5.7.20-winx64.zip 作者:Ben.Z 参考链接: Installing MySQL on Microsoft Window ...

  4. js面试题之求数组最值

    今天继续分享js常见的面试题,求数组最大值,最小值,这里列举4种常见解法,还有其他方法也可以实现,读者知道可以私信我,我将把意见列举到博客中,欢迎提出意见. 第一种,利用数组排序 var arr=[3 ...

  5. GreenPlum学习笔记:create or replace function创建函数

    原始表数据如下: 需求:现要求按分号“;”将rate_item列进行分割后插入到新的数据表中. CREATE OR REPLACE FUNCTION fun_gp_test_xxx_20181026( ...

  6. celery在Django中的集成使用

    继上回安装和使用Redis之后,看看如何在Django中使用Celery.Celery是Python开发分布式任务列队的处理库.可以异步分布式地异步处理任务,也可定时执行任务等等.通常我们可以在Dja ...

  7. TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?

    TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小.TreeMap要求存放的键值对映射的键必 ...

  8. 【PAT】1018 锤子剪刀布 (20)(20 分)

    1018 锤子剪刀布 (20)(20 分) 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算 ...

  9. 【POJ】4007.Flood-it!

    原题戳这里 题解 搜索是个好东西,不是人人都会搜 迭代加深,然后用一个函数估值,值是除了和左上连通的部分还有几个颜色不同的块,如果走的步数加上估值大于当前枚举的深度就跳出 代码 #include &l ...

  10. react-native第一次开发记录

    1.安装指定版本 react-native init demo --verbose --version 0.41.0 2.更新依赖包 npm install -g npm-check-updates ...