天天看點

二十九、EFW架構開發的系統支援SaaS模式和實作思路

 回《【開源】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.總結

      SaaS是Software-as-a-service(軟體即服務)。

      SaaS是一種通過Internet提供軟體的模式,使用者不用再購買軟體,而改用向提供商租用基于Web的軟體,來管理企業經營活動,且無需對軟體進行維護,服務提供商會全權管理和維護軟體,對于許多小型企業來說,SaaS是采用先進技術的最好途徑,它消除了企業購買、建構和維護基礎設施和應用程式的需要;

      是以我們開發一個系統要讓它支援SaaS模式,首先它必須是Web程式,這樣客戶不用另外安裝程式,隻需要浏覽器就可以直接使用;其次系統要支援“按需收費”,不同級别的客戶可能使用的系統子產品有差別,那麼我們的系統必須支援按權限配置系統子產品;還有就是我們的系統肯定隻有運作一套在中心伺服器,資料庫也隻有一套,卻要滿足不同的客戶使用系統,而且客戶之間的資料又要完全獨立,這樣需要我們在系統中有隔離機制可以按照機構區分業務資料;

1)根據注冊機構的級别,提供不同功能子產品,實作按需收費

       不同機構的按需收費,可以利用架構中的權限管理來實作。前面有一章有講EFW架構權限管理,權限控制簡單來說就是,角色配置子產品菜單,使用者綁定角色,使用者登入後根據上述配置動态生成系統菜單而達到權限的控制;不同的機構可以維護不同的角色;如果菜單級别的權限還不能滿足,還可以使用頁面子權限進行頁面中控件操作、資料顯示都可以控制;

2)一個資料庫隔離不同機構的業務資料

       不同機構的業務資料隔離,首先架構基礎資料字典中有一張機構表,管理所有機構資料,另外所有業務表都架構機構編碼WorkId字段,産生的業務資料的時候把WorkId寫入,這樣使用者查詢資料的時候根據使用者綁定的WorkId過濾業務表的資料;

另外如果系統不需要支援多機構,就隻有一個機構,那每個業務表加一個WorkId字段比較别扭,架構提供了SaaS開關,為false的時候就不需要WorkId字段;

二十九、EFW架構開發的系統支援SaaS模式和實作思路

1)添加一個新機構

新增機構後,預設建立一個機構的超級使用者,機構“企業級系統”和“測試系統”的超級使用者分别為“admin”,“admin2”,兩個使用者分别登入,打開“書籍管理”功能,如此兩個使用者顯示書籍清單資料不同。

二十九、EFW架構開發的系統支援SaaS模式和實作思路

2)Books表結構及界面資料顯示

二十九、EFW架構開發的系統支援SaaS模式和實作思路
二十九、EFW架構開發的系統支援SaaS模式和實作思路
二十九、EFW架構開發的系統支援SaaS模式和實作思路

3)代碼實作

實體Book的配置,與SaaS有關的配置是IsGB,如果IsGB=true實體不區分機構,IsGB=false實體區分機構,這裡Book是業務實體是以要區分機構,而一般隻有字典資料配置為true;

二十九、EFW架構開發的系統支援SaaS模式和實作思路

實體使用ORM儲存資料時候并不需要指定WorkId的值,而且Book實體也沒有WorkId屬性;而插入資料庫中WorkId值是架構中ORM自動處理的,這樣編寫程式的時候不需要關注WorkId,簡化編碼代碼;

二十九、EFW架構開發的系統支援SaaS模式和實作思路

實體解決不了的複雜資料庫操作,就使用Dao,Dao裡面都是直接使用SQL語句操作資料庫,是以當多機構的時候,Where條件後必須加上WorkId條件;

二十九、EFW架構開發的系統支援SaaS模式和實作思路

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

二十九、EFW架構開發的系統支援SaaS模式和實作思路

   使用架構開發SaaS模式的程式,隻需要注意這幾點:

1)配置檔案中的IsSaas=true

2)業務實體的類名自定義屬性IsGB=false

3)資料庫中業務表必須增加WorkId字段

4)背景代碼可以直接随時擷取WorkId的值