回《【开源】EFW框架系列文章索引》 html
EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0sql
EFW框架实例源代码下载:http://pan.baidu.com/s/1eQCc69G数据库
前言:之前作一个区域性医院信息系统项目,包括几十家小医院都须要上医院信息系统,之前系统都是单机构版的,就是必需要每一个医院去安装,程序和数据库都是每一个医院一套,这样的系统来作这个项目确定不行,维护实施成本过高了,因此这么多医院必须统一一套程序和数据库。并且为了客户机免安装,最好作成Web版系统,只用浏览器输入地址就可使用系统;经过对单机构版的系统进行了一次大的改版,由原来的CS架构改成BS架构,由原来数据库只支持一个医院改为支持多个医院,并且控制器机构与机构之间业务数据不一样相互访问;改版后的系统后就有点相似于SaaS模式;如今EFW框架针对SaaS模式的一些特色,作了一些功能扩展,让咱们开发系统的起点就是支持多机构的;可是在业务开发的时候又无需考虑多机构,只需单机构的思想编写代码,机构的区分框架帮咱们处理;浏览器
本文要点缓存
1.SaaS介绍服务器
2.EFW框架中支持Saas的两个技术实现架构
3.如何开发SaaS模式程序?框架
4.WorkId的值的传递原理测试
5.总结编码
SaaS是Software-as-a-service(软件即服务)。
SaaS是一种经过Internet提供软件的模式,用户不用再购买软件,而改用向提供商租用基于Web的软件,来管理企业经营活动,且无需对软件进行维护,服务提供商会全权管理和维护软件,对于许多小型企业来讲,SaaS是采用先进技术的最好途径,它消除了企业购买、构建和维护基础设施和应用程序的须要;
因此咱们开发一个系统要让它支持SaaS模式,首先它必须是Web程序,这样客户不用另外安装程序,只须要浏览器就能够直接使用;其次系统要支持“按需收费”,不一样级别的客户可能使用的系统模块有区别,那么咱们的系统必须支持按权限配置系统模块;还有就是咱们的系统确定只有运行一套在中心服务器,数据库也只有一套,却要知足不一样的客户使用系统,并且客户之间的数据又要彻底独立,这样须要咱们在系统中有隔离机制能够按照机构区分业务数据;
1)根据注册机构的级别,提供不一样功能模块,实现按需收费
不一样机构的按需收费,能够利用框架中的权限管理来实现。前面有一章有讲EFW框架权限管理,权限控制简单来讲就是,角色配置模块菜单,用户绑定角色,用户登陆后根据上述配置动态生成系统菜单而达到权限的控制;不一样的机构能够维护不一样的角色;若是菜单级别的权限还不能知足,还可使用页面子权限进行页面中控件操做、数据显示均可以控制;
2)一个数据库隔离不一样机构的业务数据
不一样机构的业务数据隔离,首先框架基础数据字典中有一张机构表,管理全部机构数据,另外全部业务表都架构机构编码WorkId字段,产生的业务数据的时候把WorkId写入,这样用户查询数据的时候根据用户绑定的WorkId过滤业务表的数据;
另外若是系统不须要支持多机构,就只有一个机构,那每一个业务表加一个WorkId字段比较别扭,框架提供了SaaS开关,为false的时候就不须要WorkId字段;
1)添加一个新机构
新增机构后,默认建立一个机构的超级用户,机构“企业级系统”和“测试系统”的超级用户分别为“admin”,“admin2”,两个用户分别登陆,打开“书籍管理”功能,如此两个用户显示书籍列表数据不一样。
2)Books表结构及界面数据显示
3)代码实现
实体Book的配置,与SaaS有关的配置是IsGB,若是IsGB=true实体不区分机构,IsGB=false实体区分机构,这里Book是业务实体因此要区分机构,而通常只有字典数据配置为true;
实体使用ORM保存数据时候并不须要指定WorkId的值,并且Book实体也没有WorkId属性;而插入数据库中WorkId值是框架中ORM自动处理的,这样编写程序的时候不须要关注WorkId,简化编码代码;
实体解决不了的复杂数据库操做,就使用Dao,Dao里面都是直接使用SQL语句操做数据库,因此当多机构的时候,Where条件后必须加上WorkId条件;
上面实例中的代码,在使用frmBook.currBook.save(); 和 strsql = string.Format(strsql, searchChar, flag,WorkId); 中的WorkId值是怎么来的?
1)用户登陆后,根据用户名就能获得用户的机构编码WorkId,并缓存在“RoleUser”,一个用户只能属于一个机构;
2)打开界面的时候初始化控制器,同时实例化oleDb对象,oleDb对象有WorkId属性,值从缓存“RoleUser”取登陆的WorkId绑定给oleDb对象,控制器中的全部代码以及后台代码实现都是使用的此oleDb对象操做数据库,因此必须将oleDb对象在Controller、ObjectModel、Entity、Dao中传递,一样多机构须要的WorkId值跟着oleDb对象就在各个对象中传递;
3)控制器对象将oleDb传递给ObjectModel对象,实例化对象必须使用NewObject()方法,经过此方法实现oleDb对象传递。因此若是使用new来实例化ObjectModel对象是不能操做数据库的;
4)oleDb传递给Dao对象,实例化对象必须使用NewDao()方法;
5)Dao中的WorkId
使用框架开发SaaS模式的程序,只须要注意这几点:
1)配置文件中的IsSaas=true
2)业务实体的类名自定义属性IsGB=false
3)数据库中业务表必须增长WorkId字段
4)后台代码能够直接随时获取WorkId的值