软件开发框架培训内容大全 - CSFrameworkV5.1旗舰版
软件开发框架培训内容大全 - CSFrameworkV5.1旗舰版
目录
- 01 - 后台连接策略(采用策略模式)
- 02 - 自动升级程序
- 03 - 系统消息
- 04 - 数据窗体分类
- 05 - 开发框架窗体基类 - frmBase
- 06 - DevExpress组件
- 07 - 开发框架模块介绍
- 08 - 数据窗体的表格支持导出Excel/PDF文件
- 09 - 权限实现原理
- 10 - 如何扩展按钮
- 11 - 系统设置
- 12 - 并发控制
- 13 - 项目开发
- 14 - WCF三种承载方式
- 15 - ORM模型
- 16 - SQLGenerator:SQL命令生成器
- 17 - CreateSqlGenerator 创建SQL命令生成器实例
- 18 - 前端界面数据采集、保存逻辑
- 19 - 开发框架使用的设计模式(GOF 23)
- 20 - OOP面向对象编程
- 21 - 为什么要用设计模式?
- 22 - 数据结构
- 23 - CSFramework.DB.dll 多数据库支持底层
- 24 - 团队开发
- 25 - Loginer.Current
- 26 - DAL层的构造器
- 27 - tb_DataSet 账套配置表
- 28 - 数据字典与业务单据命名规范
- 29 - 手动事务处理
- 30 - 加密算法
- 31 - frmMain主窗体
- 32 - WCF介绍
- 33 - WCF透明代理工厂的应用
- 34 - 代码生成器
- 35 - 数据窗体界面重要成员变量、属性和方法
- 36 - WCF服务端
01 - 后台连接策略(采用策略模式)
开发平台支持以下连接方式:
- 1. ADO直连(标准3层逻辑架构), 最快速,最高效开发方案
- 2. WCF连接,采用IIS服务器。
- 3. WebApi (基于JSON数据格式,优势:跨平台,支持多种移动端)
- 4. .NET Remoting
- 5. Tcp/IP,定制数据包,写自己的协议。基于Socket套接字。
关于Tcp/IP技术
Socket Server (Listing Port)服务器:建议采用Windows服务方式启动。
Socket Client:客户端。
02 - 自动升级程序
基于独立升级包方式进行自动升级,升级包上传到数据库的 sys_PackageTable 表。每个升级包有唯一标识,版本号。
升级程序数据库:AutoUpgrader
升级程序启动方式
主程序 → 升级程序
Main.exe → AutoUpgrader程序
参考:https://www.cscode.net/archive/autoupgrader/1634572645.html
03 - 系统消息
系统消息是指开发框架提供的内部消息机制,采用心跳机制,每分钟定时从数据库获取当前用户的最新消息,心跳时间可配置。
实现:在frmMain主窗体,通过timer主动抓取服务器的消息,消息表:CSFrameworkV5_System.dbo.sys_Messages,系统数据库:CSFrameworkV5_System
04 - 数据窗体分类
1. 基础资料窗体
既:数据字典窗体,主要用于管理与维护单表基础资料,继承 frmBaseDataDict 基类。
2. 业务单据窗体
主从表结构,或主从子表三层结构, 继承 frmBaseBusiness 基类。
05 - 开发框架窗体基类 - frmBase
frmBase继承DevExpress的XtraForm
- 支持换皮肤
- 设置多语言
- 窗体其他通用特性
06 - DevExpress组件
VS2017→不支持DevExpress15.x或以下的版本
VS2019→不支持DevExpress17.x或以下的版本
请选择安装合适的版本。
DevExpress组件下载:
https://www.cscode.net/archive/newdoc/1634037196.html
07 - 开发框架模块介绍
开发框架模块是什么?
开发框架模块是指类库(Class Library)或 VS工程项目(VS Project),编译生成DLL程序文件。
模块主窗体
模块主窗体继承 frmBaseModule 基类,以 frmMainXXX, frmXXXXXMain开头的窗体文件。
开发模块主窗体必须注意几点:
1. 定义菜单, 2. 定义按钮, 3. 实现菜单和按钮对应的Click事件, 4. 给菜单指定权限值。
08 - 数据窗体的表格支持导出Excel/PDF文件
GridControl:表格组件。
GridView:表格视图
GridView的列头可右键弹出菜单,可以导出Excel,PDF等文件。
09 - 权限实现原理
1. 界面权限
界面权限是指控制界面的功能按钮。
每个按钮有特殊的编号,为二进制数据(2^n次方表示),如:0,1,2,4,8,16,32,64…..
权限值>0值的功能按钮可以分配权限。
参考:tb_MyActions表。
2.数据权限
数据权限控制支持以下两种方式:
横向控制:基于制单人过滤记录数据,SQL脚本使用 “Where 制单人=当前用户“ 筛选数据。
纵向控制:控制界面的组件是否显示,表格的列控制,或文本输入框控制。
举例:若当前用户没有【采购单价】的数据权限,则:设列.Visible=false, 文本框.Enable=false; 或文本框.Text=0, 隐藏采购价格。
数据权限界面实现 :
通过【角色】自由扩展权限,在界面进行逻辑判断:
bool v= bllPermission.IsUserBelongRole (当前用户编号,"角色编号");
if (v) //有权限
{
//处理逻辑
}
else //没权限
{
//处理逻辑
}
基础资料、业务单据的权限值定义
基础资料窗体默认分配的权限值:
AuthorityCategory.MASTER_ACTION=111
业务单据窗体默认分配的权限值:
AuthorityCategory.BUSINESS_ACTION_VALUE=32895
10 - 如何扩展按钮
http://www.csframework.com/archive/5/arc-5-20110510-1465.htm
AuthorityCategory.MASTER_ACTION+ButtonAuthority.EX_01
11 - 系统设置
系统设置:作为系统默认的参数,用户不可更改。表名:sys_SystemSettings。
用户设置:用户个性化设置、我的设置,用户可更改。表名:sys_SystemSettingsByUser。
12 - 并发控制
开发框架的并发控制是指防脏写。
1. 什么是脏写?
一个事务修改了 另外一个事务未提交的修改过的数据。
简单的讲,A和B两个人同时打开及修改一条数据,A保存后,B再保存,此时B会覆盖A的数据。
2. 如何避免脏写?
综上所述,系统要避免覆盖A的数据,该怎么处理呢?
通过时间戳(TimeStamp)字段(TS)控制。
时间戳:TimeStamp。
标准的更新数据SQL:
UPDATE XXX SET XX WHERE PK=@PK
若加入TS, 组合复合条件,复合主键:
UPDATE XXX SET XX WHERE TS=@TS AND PK=@PK
3. 使用时间戳避免脏写原理
举例:a,b,c,d 四个人打开一张单据,单据号码:doc20210008,当前记录的TS值:2011111601234283
B最先提交数据(第1个人能保存成功),保存后TS字段的值自动更新为当前时间:如:2011111602254289
B,C,D任何一人保存数据,此时WHERE 条件不成立了,组合的SQL如下:
UPDATE XXX SET XX WHERE TS=2011111601234283 AND PK=doc20210008
提示:更新影响0条记录。
这是ADO.NET底层抛出的并发异常,因为原记录被其他用户修改,不存在了!
13 - 项目开发
CSFrameworkV5.ClientFoundation 开发架构
基于 CSFrameworkV5.ClientFoundation 基础架构开发新项目。
CSFramework.Rename VS改名工具
对基础架构VS解决方案改名,使用CSFramework.Rename工具
CSFramework.AutoUpgrader 商业版自动升级程序
https://www.cscode.net/archive/autoupgrader/1630589770.html
CSFrameworkV5.CodeGenerator.exe 代码生成器工具
https://www.cscode.net/archive/codegenerator/1630583660.html
CSFrameworkV5.SQLConnector.exe
https://www.cscode.net/archive/csframework-sqlconnector/1631288677.html
14 - WCF三种承载方式
WCF应用服务器,三种承载(Hosting、宿主)方式:
1. IIS承载,适用HTTPS协议的接口。针对微信APP开发友好。
2. WinServer承载,既Windows服务,调试比较困难,也可以调试,采用:IP地址+端口,http://122.11.53.23:18885/api/do
3. Self Hosting自承载,开发环境,调试模式,CSFrameworkV5.TesterHosting设为启动模式。
建议采用双屏开发模式,提升开发效率。
特别是Client/Server双模式调试,使用双屏有非常好的用户体验。
15 - ORM模型
模型(Model),表结构映射,将数据库表结构 转换为对应的C#类。
ORM_TableAttribute
Model类的特性,定义表名、主键、是否主表3个参数。
ORM_FieldAttribute
字段的特性(Attribute)
isAddorUpdate: 是否用于更新的字段, 用于组合SQL脚本。
isPrimaryKey:是否主键
isForeginKey:是否外键
isDocFieldName:是否单据号码,流水序号。
C/S开发框架的ORM模型基于Nhibernate架构改装的,ORM Model / 模型主要用于系统自动生成SQL脚本。
C/S框架的ORM模型基于Nhibernate架构改装的, Nhibernate作为ORM模型提交数据鼻祖。
在2005年,我们使用Nhibernate架构提交数据,开发了一套大型ERP系统。
演变:XML→C# Model,最后被Entity Framework 替换了。
16 - SQLGenerator:SQL命令生成器
基本原理
根据C#的Model模型,通过.NET反射类的全部属性, 获取 ORM_FieldAttribute 特殊各个参数的值,自动组合三种SQL脚本。
假设C#类,模型定义:
public class 表
{
public string PK {get;set;}//主键
public string F1 {get;set;}
public string F2 {get;set;}
public string Fn {get;set;}
}
自动生成三种脚本
INSERT 表(F1,F2,Fn)values (@F1,@F2,@Fn)
UPDATE 表 SET F1=@F1 WHERE PK=@PK
DELETE 表 WHERE PK=@PK
TIP: 针对需要保存的表,生成对应的Model。
17 - CreateSqlGenerator 创建SQL命令生成器实例
DAL层的CreateSqlGenerator方法:根据当前提交的表(DataTable)的表名,实例化SQL命令生成器对象。
当前DAL层提交多少张表,要定义对应的关系。
18 - 前端界面数据采集、保存逻辑
1. 数据采集实现逻辑
将当前操作界面修改的数据组合一个DataSet内,作为临时数据,然后提交到数据库。
调用DataTable.GetChanges()返回一个新的DataTable实例,然后把DataTable实例放到DataSet里面。
若界面为主从表,主从子表结构,需要采集多张表的数据,放到DataSet里面。
2. 保存数据逻辑
数据采集完成后,调用业务逻辑层的保存方法:BLL.Update(DataSet) --> DAL.Update(DataSet)。
循环DataSet.Tables,逐张表提交, 参考dal基类的两个方法:
- dalBaseDataDict.Update()
- dalBaseDataDict.UpdateEx(DataSet)
- dalBaseBusiness.Update()
19 - 开发框架使用的设计模式(GOF 23)
常用设计模式
策略模式(Strategy),工厂模式(Factory),单例模式(Singleton),命令模式(Command),模板(Template),Façade(界面模式),桥接模式(Bridge),组合模式(Composite),访问者模式(Visitor)
State Machine(状态机) 电梯,等等。
更多设计模式文档:https://www.cscode.net/Search/Q?id=设计模式
20 - OOP面向对象编程
OOP语言,纯面向对象,万物皆对象!
OOP语言: 类、实体、实例、继承、接口、重写、抽象。
面向结构编程,结构化程序设计(Structured Programming),面向结构编程语言有:c,pascal,basic,主要是方法+函数+变量+常量编程方式。
1.OOP,设计模式,不是必须的。
2.而数据结构:必须的!
21 - 为什么要用设计模式?
单列模式特点:类里面必须定义自己的实例,并且只运行实例化一次。
举例:获取一组常用数据,如【产品资料】,因为【产品资料】需要在多个界面使用的。
若不使用设计模式,你必须在各个界面重复定义查询产品资料数据。
22 - 数据结构
二进制
二进制运算逻辑(AND, OR, NOT)。
数组(Array)
(1维,2维,3维)、Array
列表(List)
List / ArrayList 实现IList接口, 有枚举器 IEnumetor。
数据类型(DataTypes)
了解常用数据类型,如:string,int,money,float,double,boolean,datetime等。
指针(Point)
内存地址,比如:日期类型的8位,数字4位。
枚举 Enumeration
for rech(循环)使用。
排序算法(Sorting)
比如冒泡排序算法, asc / desc,升序,降序。
队列(Queue)
如:先进先出、先进后出、后进先出、后进后出。
树(Tree)
树干+叶子,二叉树。
堆(Heap):先进后出结构。
栈(Stack):先进先出结构。
Hash表(散列表)
Hashtable, Dictionary字典。
链(Link)
链条(类似单车链条),主要用于Command命令模式,命令传递链:A→B→C
23 - CSFramework.DB.dll 多数据库支持底层
提供:MsSQL, Oracle, MySQL三种常用数据库接口。
核心接口:IDatabase
CSFramework.DB 软件简介:
https://www.cscode.net/archive/csframework.db/1630589248.html
24 - 团队开发
项目(Project DLL) 分离。
源码管理器:GIT、SVN、TFS。
必须有详细的开发文档,如:《详细设计说明书》
参考:
https://www.cscode.net/archive/newdoc/cs-210903193552570-84.html
软件系统详细设计说明书-自动目录模板docx文档下载:
https://www.cscode.net/archive/newdoc/cs-210903193606514-31.html
25 - Loginer.Current
Loginer.Current,当前登录用户全局对象,重要属性:User账号,账套编号,IP,登录时间。
26 - DAL层的构造器
如:dalPN(Loginer), 用于获取账套编码,建立对应账套的数据库连接。
27 - tb_DataSet 账套配置表
System库的 tb_Dataset 表。
28 - 数据字典与业务单据命名规范
xxxxDataDict:数据字典,DataDict,单表数据。
xxxBusiness:业务单据,Business,主从表结构的单据。
29 - 手动事务处理
需要重写DAL层的Update方法,Demo源码例子:dalPO.cs
30 - 加密算法
MD5算法
主要用于APP移动端,比如手机号登录的密码。
对称加密算法
如:DES, AES, RSA, Rijndael,开发框架默认使用Rijndael加解密,加密后字符串:3H0hVJsk1255KgahWKTyGA==
31 - frmMain主窗体
命名控件:CSFrameworkV5.Library.Entry.frmMain
frmMain.cs 主窗体重要方法:
InitUserInterface 系统初始化
_ModuleManager.LoadModules 动态加载dll模块
32 - WCF介绍
WCF是WebService迭代升级版本,开发框架高级版V3.0、企业版V4.0、旗舰版V5.0全部使用WCF。最前期的版本使用WebService。
ICommunication 通信接口
WCF真正的通信底层接口是:ICommunication 通信接口。
ICommunication 接口几个重要方法:
ICommunication.Open();
ICommunication.Close();
//创建通信通道
ICommunication cs= ChannelFactory.Create();
cs.Open();
//强制转换为具体的接口,获取数据
ICommonService svc=( IcommonService) cs;
Svc.GetData()
33 - WCF透明代理工厂的应用
Svc=WCFFactory.Create<CSFrameworkV5.WCFContract.ISystemSecurityService>();
Svc.GetData()
对比WebService,再也不需要手动添加Web服务引用了!您只需要引用WCF的接口,使用透明代理工厂实例化接口即可!
WebService需要手动添加引用服务,VS自动生成一堆WebService代理类。
34 - 代码生成器
CSFramework代码生成器基于数据库的表结构生成源码,先建表,再生成代码。
生成模块(Project)
生成业务模块后,必须在Assembly.cs里面改 AssemblyModuleEntry
特性。
生成单表界面,举例:dt_Doc表。
生成代码注意以下2点
1. 生成的DAL层源码命名空间:
CSFrameworkV5.Server.DataAccess→改为:CSFrameworkV5.DataAccess
2. 生成的BLL层
删除无效的using:using CSFrameworkV5.WebRef.DataDictModule;
代码生成器3个核心视频
点击下载:生成项目工程模块(Project), 密码: jzqo 分辨率:1600x900
点击下载:生成数据字典窗体(DataDict Form), 密码: kic0
点击下载:生成业务单据窗体(Business Form), 密码: erus
下载地址:
https://www.csframework.com/cs-code-generator.htm
35 - 数据窗体界面重要成员变量、属性和方法
_buttons成员变量
当前界面按钮对象集合。
获取按钮对象:
IButtonInfo btn=_buttons.GetButtonByName(“btnAdd”);
btn.Enable=false; // 禁用按钮
ButtonStateChanged
当按钮状态发生变化的时候触发该事件,主要对当前界面的组件状态做控制,比如修改组件的 Enable, ReadOnly属性, 改字体颜色等操作。
増、删、改、查、保存、取消等操作会触发ButtonStateChanged事件。
ButtonStateChanged事件会频繁调用:不要在ButtonStateChanged事件中处理数据逻辑、或查询数据。
OnEmbeddedNavigatorButtonClick
明细表格按钮的事件
CreateOneDetail
创建一条明细表记录。
数据操作窗体(单表、主从表窗体)按钮事件
http://www.csframework.com/archive/1/arc-1-20201110-2925.htm
自动下拉弹框表格过滤数据组件ucMyLookUpEdit
http://www.csframework.com/archive/1/arc-1-20200328-2819.htm
36 - WCF服务端
WCF服务器VS解决方案
WCF客户端代理类接口实现
透明代理:创建WCF实例
如何在客户端创建WCF对象实例?
private void TestCommonService()
{
string uri = "net.tcp://localhost:8585/CommonService";
//创建透明代理
ICommonService svc = WCFInvokeContext.CreateWCFService<ICommonService>(uri, BindingType.NetTcpBinding);
try
{
(svc as ICommunicationObject).Open();//打开WCF通道
//模拟用户登陆信息
byte[] loginTicket = new byte[] { 22, 141, 34, 123, 55, 2, 23, 73, 22 };
//调用WCF接口
byte[] bs = svc.GetAttachedFiles(loginTicket, "PO201805130002");
//将byte数组转换为DataSet
DataSet ds = ZipTools.DecompressionDataSet(bs);
}
finally
{
(svc as ICommunicationObject).Close();//关闭通道
}
}
WCF参考文档
1. WCF服务,使用Win服务承载WCF
http://www.csframework.com/archive/1/arc-1-20170913-2325.htm
2. C# ASP.NET WebApi服务器搭建详解 - Win服务承载(Windows Service Hosting宿主)
http://www.csframework.com/archive/1/arc-1-20200217-2723.htm
3. 使用批处理文件安装或卸载WCF服务(Windows服务)
http://www.csframework.com/archive/1/arc-1-20170305-2294.htm