回《【开源】EFW框架系列文章索引》       

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模式和实现思路的更多相关文章

  1. AngularJS进阶(二十九)AngularJS项目开发技巧之localStorage存储

    AngularJS项目开发技巧之localStorage存储       注: localStorage深度学习 绪 项目开发完毕,测试阶段发现后台管理端二维码生成有问题,问题在于localStora ...

  2. Web 开发人员和设计师必读文章推荐【系列二十九】

    <Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  3. 【开源框架】EFW框架中的系统权限与页面子权限详解

    回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://pan.baid ...

  4. WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]

    原文:WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载] 我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码 ...

  5. mysql进阶(二十九)常用函数

    mysql进阶(二十九)常用函数 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整数值 EXP ...

  6. Citrix服务器虚拟化之二十九 XenApp 6.5发布服务器上的应用程序

    Citrix服务器虚拟化之二十九  XenApp 6.5发布服务器上的应用程序 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1)  服务器桌面:发布场中服务 ...

  7. Bootstrap <基础二十九>面板(Panels)

    Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...

  8. VMwarevSphere 服务器虚拟化之二十九 桌面虚拟化之安装View副本服务器

    VMwarevSphere 服务器虚拟化之二十九  桌面虚拟化之安装View副本服务器 VMware View中高可用性可是一个必须要考虑的问题.在整个虚拟桌面环境中View Connection S ...

  9. Bootstrap入门(二十九)JS插件6:弹出框

    Bootstrap入门(二十九)JS插件6:弹出框 加入小覆盖的内容,像在iPad上,用于存放非主要信息 弹出框是依赖于工具提示插件的,那它也和工具提示是一样的,是需要初始化才能够使用的 首先我们引入 ...

随机推荐

  1. SignalR初体验

    简介 ASP .NET SignalR[1]  是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以 ...

  2. 深入浅出OOP(六): 理解C#的Enums

    MSDN定义:枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法.  例如,假设您必须定义一个变量,该变量的值表示一周中的一天. 该变量只能存储七个有意义的值. 若要定义这 ...

  3. AngularJS快速入门指南06:过滤器

    thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...

  4. 关于网卡eth0、eth1以及服务器为什么要把内网和外网卡区分开

    在搜搜上看到了这个回答,它解释了什么是eth0,eth1: eth0和eth1这是网卡设备,只是个名称不必纠结.通常服务器会有多个网卡的,所以就有eth0 eth1 eth2 这样的名称,而且在一些系 ...

  5. 将Eclipse代码导入到AndroidStudio的两种方式

    版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/4183553.html 说到使用AndroidStudio,除 ...

  6. atitit.提升稳定性---hibernate 增加重试retry 机制解决数据库连接关闭

    atitit.提升稳定性---hibernate 增加重试retry 机制解决数据库连接关闭 1. 流程总结 retry(5times).invoke(xxx).test().rest().$() t ...

  7. iOS开发——高级技术&调用地图功能的实现

    调用地图功能的实现 一:苹果自带地图 学习如逆水行舟,不进则退.古人告诉我们要不断的反思和总结,日思则日精,月思则月精,年思则年精.只有不断的尝试和总结,才能让我们的工作和生活更加 轻松愉快和美好.连 ...

  8. hdu 2844 多重背包coins

    http://acm.hdu.edu.cn/showproblem.php?pid=2844 题意: 有n个硬币,知道其价值A1.....An.数量C1...Cn.问在1到m价值之间,最多能组成多少种 ...

  9. hive学习3(hive基本操作)

    hive基本操作 hive的数据类型 1)基本数据类型 TINYINT,SMALLINT,INT,BIGINT FLOAT/DOUBLE BOOLEAN STRING 2)复合类型 ARRAY:一组有 ...

  10. 在VC项目中附加包含目录

    1.VC2010项目中附加包含目录 上图项目中附加了两个文件夹,一个是上级目录下的CommonClass,一个是下级目录下的invengo. 使用这两个目录下的类时直接在include后面写头文件名即 ...