Rookey.Frame之系统初始化
昨天介绍了数据库的配置,今天继续介绍系统的初始化功能;针对系统初始化在开发中也是很重要的一部分,它可以提前将相关数据提前自动初始化到系统中,同时也可以为上线测试提供方便,可以很方便进行系统测试演练,防止人为处理带来的隐患并且可以节省大量部署时间。
本框架中系统初始化包含数据库(包括默认库和自定义库)初始化、数据表初始化、系统数据初始化以及自定义数据初始化,在Rookey.Frame.Controllers\UserController.cs用户控制器中,在登录页面Login(Action)中,系统会自行判断当前系统是否需要初始化,判断条件是判断用户表中是否存在用户数据,同时会判断数据库是否存在,如果数据库不存在则先初始化数据库,判断初始化代码如下:
/// <summary> /// 是否需要初始化 /// </summary> /// <returns></returns> public static bool IsNeedInit() { try { DbLinkArgs dbLinkArgs = ModelConfigHelper.GetLocalDbLinkArgs(); if (dbLinkArgs == null) return true; if (!SystemOperate.DbIsExists(dbLinkArgs)) { //向各数据库注册存储过程 SystemOperate.RegStoredProcedure(); //在当前数据库中自动注册外部链接数据库服务器 SystemOperate.RegCrossDbServer(); } string errMsg = string.Empty; long count = CommonOperate.Count<Sys_User>(out errMsg, false); return count == 0; } catch { return true; } }
在判断需要初始化后,系统会依次进行数据表初始化、字段修复(目前只支持字段增加)、模块数据初始化、列表信息及列表字段初始化、列表按钮初始化、表单信息及表单字段初始化、图标初始化、添加管理员角色和用户、初始化系统菜单、调用自定义初始化
Rookey.Frame框架是基于业务无的框架,可以很容易将其应用到新项目中,只需要将相关组件添加到引用即可,详见Rookey.Demo,很多时候在一个稍大点的公司系统也很多,但是系统复用性非常低,重复造轮子的代码到处都是,一个系统中已经实现了但由于耦合性太强,另外一个系统不得不自己再写一套相关的逻辑处理,能共用的组件很少,有的一般也是采用服务或接口方式提供,本人从事信息化以来所在的公司很少有公司有一套公共的系统框架可复用,所以写此框架的目的也是基于此,Rookey.Frame做为一套基础框架,可以在其上衍生出自己的业务框架,这样业务框架也可以达到复用的目的,公司各个系统在此基础上可以进行快速开发,节省人力开发成本、时间成本,当然本框架也存在很多问题,我也会尽全力将其完善。说了这么多其他是想说自定义初始化的部分,当系统框架稳定后应该是一套独立的组件,开发新项目时直接引用即可,这时候框架初始化的时候同时初始化当前项目数据;在Rookey.Frame.Operate.Base\InitFactory.cs基类中提供了一个自定义初始化的抽象方法
/// <summary> /// 自定义初始化,包括菜单、模块、字段、字典等数据初始化 /// </summary> public abstract void CustomerInit();
在各自的项目中只要继承框架中InitFactory类重写此方法即可初始化即可。
以下为Rookey.Demo中自定义初始化代码:
/// <summary> /// 自定义初始化 /// </summary> public class InitOperate : InitFactory { /// <summary> /// 自定义初始化 /// </summary> public override void CustomerInit() { string errMsg = string.Empty; CommonOperate.DeleteRecordsByExpression<Sys_Menu>(x => x.Name == "行政管理" || x.Name == "礼品申请", out errMsg); Sys_Menu XZMenu = new Sys_Menu() { Name = "行政管理", Display = "行政管理", IsLeaf = false, IsValid = true }; Guid xZMenuId = CommonOperate.OperateRecord<Sys_Menu>(XZMenu, Frame.Operate.Base.OperateHandle.ModelRecordOperateType.Add, out errMsg); Guid detpModuleId = SystemOperate.GetModuleIdByName("礼品申请"); if (xZMenuId!=Guid.Empty) { List<Sys_Menu> list = new List<Sys_Menu>(); list.Add(new Sys_Menu() { Name = "礼品申请", Display = "礼品申请", ParentId = xZMenuId, Sys_ModuleId = detpModuleId, IsLeaf = true, IsValid = true }); CommonOperate.OperateRecords<Sys_Menu>(list, Frame.Operate.Base.OperateHandle.ModelRecordOperateType.Add, out errMsg); } } }
OK,今天初始化的部分就介绍到此地,下次给大家介绍下系统通用类,祝大家生活愉快!