Rookey.FastDevFrame v1.0介绍

背景

最近遇到一个小项目,前期需求比较简单,只有几个简单功能模块,但是后期需求又不太确定,而且时间催的紧,如果选用以前的框架的话,感觉比较重量级,如果使用简单的ADO.NET操作能解决,又担心后期扩展性的问题,由此想自己做一个轻量级的与业务无关的后台框架,保证使用简单又能便于后期扩展,于是Rookey.FastDevFrame v1.0诞生了。

框架思路

在通用三层框架的基础上保证各层的能够扩展,具体见下图:

以上框架基本实现,下面介绍下框架的特点

框架特点

(1)只有一个dll,小巧灵活,使用方便

(2)与业务实体无耦合,不依赖实体层

(3)可扩展性强,支持业务层重写,支持数据层重写,支持操作事件处理

(4)多种关系类型数据库支持,目前支持的数据库类型有mssql,可扩展支持mysql,oracle及其他

(5)支持非关系型数据库Mongodb,可扩展支持其他

(6)模块缓存可配置,支持本地缓存和Memcached分布式缓存,可扩展其他缓存方式

(7)支持SQL语句操作、支持Lamda表达式与SQL联合查询、支持读写分离

(8)实体层、数据层、业务层、操作事件层可配置

(9)在中小型项目中能极大提高开发效率

接下来给出实例讲解如何使用框架

使用框架

首先新建测试项目,为了演示方便建一个控制台程序

接下来在项目中新建实体类

 1     /// <summary>
 2     /// 流程信息表
 3     /// </summary>
 4     public class Dsg_ProcInfo
 5     {
 6         [PrimaryKey]
 7         [AutoIncrement]
 8         public long? Id { get; set; }
 9
10         public string CreateUserName { get; set; }
11
12         public string ModifyUserName { get; set; }
13
14         public DateTime? CreateDate { get; set; }
15
16         public DateTime? ModifyDate { get; set; }
17
18         /// <summary>
19         /// 是否删除
20         /// </summary>
21         public bool IsDeleted { get; set; }
22
23         /// <summary>
24         /// 是否有效
25         /// </summary>
26         public bool IsValid { get; set; }
27
28         /// <summary>
29         /// 流程编码
30         /// </summary>
31         public string Code { get; set; }
32
33         /// <summary>
34         /// 流程名称
35         /// </summary>
36         public string Name { get; set; }
37
38         /// <summary>
39         /// 流程显示名称
40         /// </summary>
41         public string DisplayName { get; set; }
42
43         /// <summary>
44         /// 版本号
45         /// </summary>
46         public int Version { get; set; }
47
48         /// <summary>
49         /// 备注
50         /// </summary>
51         public string Memo { get; set; }
52     }

建完实体类就可以使用了,呵呵,就是这么简单

先在Program类中添加框架初始化配置方法:

 1 /// <summary>
 2         /// 初始化配置
 3         /// </summary>
 4         static void InitConfig()
 5         {
 6             //必须配置
 7             FrameConfig.ModelAssemblyName = "Rookey.FastDevFrameTest";
 8             //可选择配置
 9             FrameConfig.ModelNamespaceName = "FastDevFrameTest.Model";
10         }

如果是在Web项目中,可以将配置方法放到Global.asax中

接下来初始化数据表,先在数据库新建数据库,名称随意,暂且叫FastDevFrame_Test

再在Program类中新建一个初始化数据表的方法

 1         /// <summary>
 2         /// 初始化数据表
 3         /// </summary>
 4         /// <returns></returns>
 5         static bool InitTables()
 6         {
 7             string errMsg = string.Empty;
 8             List<Type> modelTypes = BridgeObject.GetAllModelTypes();
 9             //修复数据表或字段
10             errMsg = InitOperate.CreateOrRepairTableFields(modelTypes);
11             return string.IsNullOrEmpty(errMsg);
12         }

最后在main方法中添加如下代码:

 1        static void Main(string[] args)
 2         {
 3             InitConfig();
 4             if (InitTables())
 5             {
 6                 string errMsg = string.Empty;
 7                 //获取单个实体
 8                 Dsg_ProcInfo dsgInfo = CommonOperate.GetEntity<Dsg_ProcInfo>(x => x.Name == "测试流程", null, out errMsg);
 9                 if (dsgInfo == null)
10                 {
11                     dsgInfo = new Dsg_ProcInfo() { Code = "001", Name = "测试流程", DisplayName = "测试流程" };
12                     //新增实体
13                     CommonOperate.OperateRecord<Dsg_ProcInfo>(dsgInfo, ModelRecordOperateType.Add, out errMsg);
14                 }
15             }
16         }
在CommonOperate类中封装了常用的方法,后续再进行介绍。

下面介绍下自定义业务层、自定义操作处理及启用缓存功能首先在测试项目中新建业务接口IDsg_ProcInfoBLL.cs、业务实现Dsg_ProcInfoBLL.cs及自定义操作处理类Dsg_ProcInfoOperateHandle.cs,如下图示:

自定义业务接口添加一个简单的获取流程信息接口
    public interface IDsg_ProcInfoBLL
    {
        Dsg_ProcInfo GetProInfo(string name);
    }

自定义业务类

 1 class Dsg_ProcInfoBLL : BaseBLL<Dsg_ProcInfo>, IDsg_ProcInfoBLL
 2     {
 3         public Dsg_ProcInfoBLL()
 4         { }
 5
 6         public override Dsg_ProcInfo GetEntity(out string errorMsg, Expression<Func<Dsg_ProcInfo, bool>> expression = null, string whereSql = null, string connString = null)
 7         {
 8             return base.GetEntity(out errorMsg, expression, whereSql, connString);
 9         }
10
11         public Dsg_ProcInfo GetProInfo(string name)
12         {
13             string errMsg = string.Empty;
14             return this.Dal.GetEntity(out errMsg, x => x.Name == name);
15         }
16     }

重写了通用业务层GetEntity方法,并实现自定义业务接口方法

操作处理类IOperateHandle<Dsg_ProcInfo>
 1     /// <summary>
 2     /// 操作事件处理类
 3     /// </summary>
 4     class Dsg_ProcInfoOperateHandle : IOperateHandle<Dsg_ProcInfo>
 5     {
 6         /// <summary>
 7         /// 单个实体操作(新增、修改、删除)后
 8         /// </summary>
 9         /// <param name="operateType">操作类型</param>
10         /// <param name="recordId">记录Id</param>
11         /// <param name="result">操作结果</param>
12         public void OperateCompeletedHandle(ModelRecordOperateType operateType, long recordId, bool result)
13         {
14             //单个实体操作(新增、修改、删除)完成后,做其他动作
15             return;
16         }
17
18         /// <summary>
19         /// 单个实体操作(新增、修改、删除)前处理
20         /// </summary>
21         /// <param name="operateType">操作类型</param>
22         /// <param name="t">实体对象</param>
23         /// <param name="errMsg">异常信息</param>
24         /// <returns></returns>
25         public bool BeforeOperateVerifyOrHandle(ModelRecordOperateType operateType, Dsg_ProcInfo t, out string errMsg)
26         {
27             errMsg = string.Empty;
28             //操作前,可以做业务逻辑验证
29             if (operateType == ModelRecordOperateType.Add) //如果是新增
30             {
31             }
32             return true;
33         }
34
35         /// <summary>
36         /// 多个实体操作(新增、修改、删除)后
37         /// </summary>
38         /// <param name="operateType"></param>
39         /// <param name="recordIds"></param>
40         /// <param name="result"></param>
41         public void OperateCompeletedHandles(ModelRecordOperateType operateType, List<long> recordIds, bool result)
42         {
43             //多个实体操作(新增、修改、删除)完成后,做其他动作
44         }
45
46         /// <summary>
47         /// 多个实体操作(新增、修改、删除)前处理
48         /// </summary>
49         /// <param name="operateType"></param>
50         /// <param name="ts"></param>
51         /// <param name="errMsg"></param>
52         /// <returns></returns>
53         public bool BeforeOperateVerifyOrHandles(ModelRecordOperateType operateType, List<Dsg_ProcInfo> ts, out string errMsg)
54         {
55             errMsg = string.Empty;
56             return true;
57         }
58     }
接下来将初化配置方法改成如下:
 1         /// <summary>
 2         /// 初始化配置
 3         /// </summary>
 4         static void InitConfig()
 5         {
 6             //必须配置
 7             FrameConfig.ModelAssemblyName = "Rookey.FastDevFrameTest";
 8             //可选择配置
 9             FrameConfig.ModelNamespaceName = "FastDevFrameTest.Model";
10             //有自定义业务接口时需要配置
11             FrameConfig.IBllAssemblyName = "Rookey.FastDevFrameTest";
12             //有自定义业务层重写时需要配置
13             FrameConfig.BllAssemblyName = "Rookey.FastDevFrameTest";
14             //操作事件
15             FrameConfig.OperateHandleAssemblyName = "Rookey.FastDevFrameTest";
16             //缓存配置
17             FrameConfig.IsEnableCache = true;
18             FrameConfig.CacheTableNames = new List<string>() { "Dsg_ProcInfo" };
19         }

增加业务层、操作处理、缓存配置

最后修改main方法为

 1        static void Main(string[] args)
 2         {
 3             InitConfig();
 4             if (InitTables())
 5             {
 6                 string errMsg = string.Empty;
 7                 //获取单个实体
 8                 Dsg_ProcInfo dsgInfo = CommonOperate.GetEntity<Dsg_ProcInfo>(x => x.Name == "测试流程", null, out errMsg);
 9                 if (dsgInfo == null)
10                 {
11                     dsgInfo = new Dsg_ProcInfo() { Code = "001", Name = "测试流程", DisplayName = "测试流程" };
12                     //新增实体
13                     CommonOperate.OperateRecord<Dsg_ProcInfo>(dsgInfo, ModelRecordOperateType.Add, out errMsg);
14
15                     //反射执行自定义业务层方法
16                     object dsgObj = CommonOperate.ReflectExecuteBLLMethod(typeof(Dsg_ProcInfo), "GetProInfo", new object[] { "测试流程" });
17
18                     //非反射方式执行自定义业务层方法
19                     IDsg_ProcInfoBLL procInfoBll = BridgeObject.Resolve<IDsg_ProcInfoBLL>();
20                     Dsg_ProcInfo info = procInfoBll.GetProInfo("测试流程");
21
22                     //自定义数据库连接
23                     Dsg_ProcInfo obj = CommonOperate.GetEntity<Dsg_ProcInfo>(null, null, out errMsg);
24                     Expression<Func<Dsg_ProcInfo, bool>> expression = x => x.Name == "测试流程";
25                     string connStr = "Data Source=127.0.0.1;Initial Catalog=FastDevFrame_Test;User ID=sa;Password=123456;Pooling=true;MAX Pool Size=512;Min Pool Size=50;Connection Lifetime=30";
26                     object tmpObj = CommonOperate.GetEntity("Dsg_ProcInfo", expression, null, out errMsg, connStr);
27
28                     CommonOperate.DeleteRecordsByExpression<Dsg_ProcInfo>(x => x.Name == "测试流程", out errMsg);
29                 }
30             }
31         }

是不是感觉很方便,不过由于所有层都在一个DLL中,也容易出现乱调用的情况,需要项目经理或负责人进行规范化。

本节对框架只做一个简单的介绍,在后面的章节中对各通用类及使用进行介绍,希望与有志于.NET开发的朋友多多交流学习。

最后附上源代码 Rookey.FastDevFrame_v1.0

时间: 2024-10-13 22:13:44

Rookey.FastDevFrame v1.0介绍的相关文章

Rookey.Frame v1.0 视频教程之三发布-框架核心思想介绍

本期发布视频: (三)Rookey.Frame v1.0框架核心思想 介绍了Rookey.Frame v1.0框架搭建的核心思想,将框架核心思想理解清楚,对框架运行就会得心应手 官方视频教程: http://rookey.gotoip2.com/Page/Example.html?page=Example&flag=Video 下期视频将介绍如何通过Rookey.Frame v1.0极速开发平台项目结构及核心代码介绍

Rookey.Frame v1.0 视频教程发布了

经过昨天几个小时的折腾, Rookey.Frame v1.0开发视频教程终于发布了,由于是第一次做视频有很多地方做的不够好,后续我会慢慢改进,争取将视频教程做好. 本期发布视频: (一)Rookey.Frame v1.0在线新建模块 介绍了如何零代码建立模块及实现增.删.改.查.导入.导出.表单附件等相关功能 (二)Rookey.Frame v1.0在线配置流程 介绍了如何在Rookey.Frame v1.0极速开发平台中在线进行流程设计.流程参数配置及发起审批流程 官方视频教程: http:/

DataScope v1.0 多功能串口虚拟示波器使用介绍

DataScope v1.0 特性 1.无需安装,启动即用;2.支持同时刷新多达10个通道的单精度浮点型数据;3.支持多种格式的通道数据导入.导出及回放;4.支持全屏浏览;5.支持图表数据统计.测量及缩放;6.支持蓝牙适配器;7.支持各通道独立刷新;8.支持3D轨迹显示;9.3D立方体显示;10.航空仪表;11.灵活可屏蔽的快捷键支持. 准备工作 在使用时我们要先引入头文件“ #include "DataScope_DP.h" ”,这个头文件中定义了我们需要用的2个函数和一个数组,分别

heatmap.js v1.0 到 v2.0,详细总结一下:)

前段时间,项目要开发热力图插件,研究了heatmap.js,打算好好总结一下. 本文主要有以下几部分内容: 部分源码理解 如何迁移到v2.0 v2.0官方文档译文 关于heatmap.js介绍,请看这里: http://www.oschina.net/p/heatmap-js 目前,对于热力图的开发,百度.高德开发平台上使用的都是这款JS开源库.当然,现在还有我们公司:P 百度示例:http://developer.baidu.com/map/jsdemo.htm#c1_15 高德示例:http

Python编写 随手记v1.0贺岁版 发布(开源)

随手记是一款占用内存少,便捷的记录软件,用于记录自己的偶然灵感和发现的账号密码(搭建自己的密码库)下载链接:http://pan.baidu.com/s/1eQitQD0 开发目的: 1.我平时经常会分析别人的软件,或者浏览文章时会突然闪现自己的想法,每次都要(新建文本文档,打字,保存,重命名文档)十分麻烦 2.一直想搭建自己的密码库,但是发现新密码后总是很懒,懒着保存起来,利用本程序可以省事的保存 账号密码(默认路径 E:/password.txt) 3. 因为如上原因需要每次花费许多秒, 用

ASP.NET Boilerplate终于发布v1.0了

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:ABP经过2年多的开发,终于发布第一个主要版本了,谨此提醒ABP的使用者. ASP.NET Boilerplate之前顺带介绍过两次.下面直接摘抄一点阳铭的介绍(http://www.cnblogs.com/mienreal/p/4528641.html): ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NE

基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0

作者:小波 QQ:463431476 请关注我的博客园:http://www.cnblogs.com/xiaobo-Linux/  感觉我要火~~这比我是装定了!! 我的第二款软件:CET四六级单词背诵软件.基于QT5.5.0.sql数据库.以及TTS文本识别语音单词朗读的一款软件. 第一款软件的sql数据库软件的编写:http://www.cnblogs.com/xiaobo-Linux/p/4676950.html 现在来讲解我的第二款高大上的代码: 这个是.pro的代码,其中axconta

根据群ID和用户Id查询 + string QueryQunByUserIdAndQunId(int userId, int qunId) V1.0

#region  根据群ID和用户Id查询 + string QueryQunByUserIdAndQunId(int userId, int qunId)  V1.0        /// <summary>        /// 13.0 根据群ID和用户Id查询        /// </summary>        /// <param name="userId"></param>        /// <param na

_00024 尼娜抹微笑伊拉克_云计算ClouderaManager以及CHD5.1.0群集部署安装文档V1.0

笔者博文:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_00024 妳那伊抹微笑_云计算之ClouderaManager以及CHD5.1.0集群部署安装文档V1.0 个性签名:世界上最遥远的距离不是天涯,也不是海角.而是我站在妳的面前.妳却感觉不到我的存在 技术方向:Flume+Kafka+Storm+Redis/Hbase+Hadoop+Hive+Mahou