二十九、EFW框架开发的系统支持SaaS模式和实现思路
EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0
EFW框架实例源代码下载:http://pan.baidu.com/s/1eQCc69G
前言:以前做一个区域性医院信息系统项目,包括几十家小医院都需要上医院信息系统,以前系统都是单机构版的,就是必须要每个医院去安装,程序和数据库都是每个医院一套,这样的系统来做这个项目肯定不行,维护实施成本太高了,所以这么多医院必须统一一套程序和数据库。而且为了客户机免安装,最好做成Web版系统,只用浏览器输入地址就可以使用系统;通过对单机构版的系统进行了一次大的改版,由原来的CS架构改为BS架构,由原来数据库只支持一个医院改成支持多个医院,而且控制器机构与机构之间业务数据不同相互访问;改版后的系统后就有点类似于SaaS模式;现在EFW框架针对SaaS模式的一些特点,做了一些功能扩展,让我们开发系统的起点就是支持多机构的;但是在业务开发的时候又无需考虑多机构,只需单机构的思想编写代码,机构的区分框架帮我们处理;
本文要点
1.SaaS介绍
2.EFW框架中支持Saas的两个技术实现
3.如何开发SaaS模式程序?
4.WorkId的值的传递原理
5.总结
1.SaaS介绍
SaaS是Software-as-a-service(软件即服务)。
SaaS是一种通过Internet提供软件的模式,用户不用再购买软件,而改用向提供商租用基于Web的软件,来管理企业经营活动,且无需对软件进行维护,服务提供商会全权管理和维护软件,对于许多小型企业来说,SaaS是采用先进技术的最好途径,它消除了企业购买、构建和维护基础设施和应用程序的需要;
所以我们开发一个系统要让它支持SaaS模式,首先它必须是Web程序,这样客户不用另外安装程序,只需要浏览器就可以直接使用;其次系统要支持“按需收费”,不同级别的客户可能使用的系统模块有区别,那么我们的系统必须支持按权限配置系统模块;还有就是我们的系统肯定只有运行一套在中心服务器,数据库也只有一套,却要满足不同的客户使用系统,而且客户之间的数据又要完全独立,这样需要我们在系统中有隔离机制可以按照机构区分业务数据;
2.EFW框架中支持Saas的两个技术实现
1)根据注册机构的级别,提供不同功能模块,实现按需收费
不同机构的按需收费,可以利用框架中的权限管理来实现。前面有一章有讲EFW框架权限管理,权限控制简单来说就是,角色配置模块菜单,用户绑定角色,用户登录后根据上述配置动态生成系统菜单而达到权限的控制;不同的机构可以维护不同的角色;如果菜单级别的权限还不能满足,还可以使用页面子权限进行页面中控件操作、数据显示都可以控制;
2)一个数据库隔离不同机构的业务数据
不同机构的业务数据隔离,首先框架基础数据字典中有一张机构表,管理所有机构数据,另外所有业务表都架构机构编码WorkId字段,产生的业务数据的时候把WorkId写入,这样用户查询数据的时候根据用户绑定的WorkId过滤业务表的数据;
另外如果系统不需要支持多机构,就只有一个机构,那每个业务表加一个WorkId字段比较别扭,框架提供了SaaS开关,为false的时候就不需要WorkId字段;

3.如何开发SaaS模式程序?
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条件;

4.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

5.总结
使用框架开发SaaS模式的程序,只需要注意这几点:
1)配置文件中的IsSaas=true
2)业务实体的类名自定义属性IsGB=false
3)数据库中业务表必须增加WorkId字段
4)后台代码可以直接随时获取WorkId的值
二十九、EFW框架开发的系统支持SaaS模式和实现思路的更多相关文章
- AngularJS进阶(二十九)AngularJS项目开发技巧之localStorage存储
AngularJS项目开发技巧之localStorage存储 注: localStorage深度学习 绪 项目开发完毕,测试阶段发现后台管理端二维码生成有问题,问题在于localStora ...
- Web 开发人员和设计师必读文章推荐【系列二十九】
<Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- 【开源框架】EFW框架中的系统权限与页面子权限详解
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://pan.baid ...
- WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]
原文:WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载] 我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码 ...
- mysql进阶(二十九)常用函数
mysql进阶(二十九)常用函数 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整数值 EXP ...
- Citrix服务器虚拟化之二十九 XenApp 6.5发布服务器上的应用程序
Citrix服务器虚拟化之二十九 XenApp 6.5发布服务器上的应用程序 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1) 服务器桌面:发布场中服务 ...
- Bootstrap <基础二十九>面板(Panels)
Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...
- VMwarevSphere 服务器虚拟化之二十九 桌面虚拟化之安装View副本服务器
VMwarevSphere 服务器虚拟化之二十九 桌面虚拟化之安装View副本服务器 VMware View中高可用性可是一个必须要考虑的问题.在整个虚拟桌面环境中View Connection S ...
- Bootstrap入门(二十九)JS插件6:弹出框
Bootstrap入门(二十九)JS插件6:弹出框 加入小覆盖的内容,像在iPad上,用于存放非主要信息 弹出框是依赖于工具提示插件的,那它也和工具提示是一样的,是需要初始化才能够使用的 首先我们引入 ...
随机推荐
- 【UML】UML序列图总结
序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图. 纵向是时间轴,时间沿竖线向下延伸. 横向轴代表了在协作中各独立对象的类元角色. 类元角色用生命线表示. 当对象存在时,角色用 ...
- CSS揭秘读书笔记 (一)
CSS揭秘读书笔记 (一) 一.半透明边框 要想实现半透明边框可以使用border: border: 10px solid hsla(0,0%,100%,.5); background: ...
- CSS3实践之路(六):CSS3的过渡效果(transition)与动画(animation)
刚开始W3C CSS Workgroup拒绝将CSS3 transition与animation加入官方标准,一些成员认为过渡效果和动画并非样式属性,而且已经可以用脚本实现.所以请大家明白,特别是We ...
- iOS开发网络篇—发送GET和POST请求(使用NSURLSession)
iOS开发网络篇—发送GET和POST请求(使用NSURLSession) 说明: 1)该文主要介绍如何使用NSURLSession来发送GET请求和POST请求 2)本文将不再讲解NSURLConn ...
- Visual Studio 2012完美的拥抱GitHub
详情请查看http://www.aehyok.com/Blog/Detail/73.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链 ...
- 于网站主机,DNS,域名解析,Web服务器关系详解
/*本文将介绍网站主机,DNS,域名解析,Web服务器关系,转载请保留以下版权*/ /*启明星工作室 www.dotnetcms.org 提供会议室预定系统,请假系统,helpdesk,工作日志系统 ...
- RFID 仿真/模拟/监控/拦截/检测/嗅探器
Sound card based RFID sniffer/emulator (Too tired after recon.cx to do draw the schematics better th ...
- Linux 查看端口被占用情况
今天发现服务器上Tomcat 8080端口起不来,老提示端口已经被占用. 使用命令: ps -aux | grep tomcat 发现并没有8080端口的Tomcat进程. 使用命令:netstat ...
- 高级屏幕空间反射: Screen Space Reflection (SSR)
自从CE3首倡SSR以来,发展至今,其质量与当年早已不能同日而语.不仅强调超越性的质量,而且强调超越性的性能.乘着周末有空撸了撸,以下是增强型实时SSR结果图.与我原来的SSR原始实现相比,新的增强型 ...
- 第六章 - 图像变换 - 图像拉伸、收缩、扭曲、旋转[1] - 仿射变换(cvWarpAffine)
拉伸.收缩.扭曲.旋转是图像的几何变换,在三维视觉技术中大量应用到这些变换,又分为仿射变换和透视变换.仿射变换通常用单应性建模,利用cvWarpAffine解决密集映射,用cvTransform解决稀 ...