回《【開源】EnterpriseFrameWork框架系列文章索引》
EnterpriseFrameWork框架實例源代碼下載: 實例下載
本章內容與上一張《利用EnterpriseFrameWork快速開發Winform系統(C/S)》關系緊密,WCF模式只是在Winform模式中的界面層和邏輯層之間加入了WCF中間件用來實現雙方的通訊,說得更簡單一點就是把Winform模式中的winController控制器給拆分為wcfController與wcfclientControlle兩個控制器並用WCF實現兩個控制器之間的通訊,雙方數據傳遞與Web模式一樣用Json數據格式;
還有一點就是我們一定要明白WCF模式並不是說把所有業務都封裝成wcf服務提供給界面層調用,wcfController跟webController一樣只是單純的業務控制器,而wcf服務在框架中也只有一個就是在WCFHosting服務主機中WCFHandlerService,用來實現通訊的;
本文要點:
1.WCF版界面效果
2.WCF項目開發步驟
3.代碼文件調用關系圖
4.常見問題匯總
1.同樣是用書籍的管理作實例,實現對書籍的增、刪、改、查功能,我們先看界面效果
如下,請注意紅色框部分,點擊界面的保存按鈕后,第二張圖的WCF主機就會接收到保存書籍的命令並執行,紅色框為執行過程;(其中WCF主機會再后續章節詳細說明)
解決方案目錄,其中紅色文件為本章實例新增的文件
2.開發步驟:
1)新增WCF控制器,如上(bookWcfController.cs)
2)新增WCFCient界面控制器,如上(bookwcfclientController.cs)
其中實體(Book.cs)、Dao(BookDao.cs)和界面(frmBookManager.cs)在上一章實例中已經完成,所以本章直接調用就行了,加上本章新增的bookWcfController.cs和bookwcfclientController.cs就可以讓WCF模式實例運行起來;
bookWcfController.cs文件

using System; using System.Collections.Generic; using System.Linq; using System.Text; using EFWCoreLib.WCFHandler; using Books.Entity; using Books.Dao; using System.Data; namespace Books.WcfController { [WCFController] public class bookWcfController : JsonWCFController { [WCFMethod] public string SaveBook() { var data= ToObject(ParamJsonData); Book book = ToObject<Book>(ToArray(data)[0]); book.BindDb(oleDb, _container);//反序列化的對象,必須綁定數據庫操作對象
book.save(); return "true"; } [WCFMethod] public string GetBooks() { BookDao bdao = NewDao<BookDao>(); DataTable dt = bdao.GetBooks("", 0); return base.ToJson(dt); } } }
bookWcfController對象的功能方法其實與第二章中Web模式的bookController控制器。
一樣的,只是接收參數數據與返回json數據的方式一點點的區別而已;再就是bookWcfController對象必須繼承框架中的JsonWCFController對象,還有配置類的自定義標簽[WCFController]和方法的標簽[WCFMethod],用來區別其他模式的控制器。
bookwcfclientController.cs文件

using System; using System.Collections.Generic; using System.Linq; using System.Text; using EFWCoreLib.WCFHandler; using Books.WinController.Iviewform; using System.Data; using Books.Entity; namespace Books.Winform.WcfAction { [EFWCoreLib.WinformFrame.Controller.Menu]//與系統菜單對應 [EFWCoreLib.WinformFrame.Controller.View(DllName = "Books.Winform.dll", ViewTypeName = "Books.Winform.Viewform.frmBookManager", DefaultView = true)] public class bookwcfclientController : BaseWCFClientController { IfrmBook frmBook; public override void Init() { frmBook = (IfrmBook)DefaultView; //初始化加載書籍目錄 GetBooks(); } //獲取書籍目錄 public void GetBooks() { //通過wcf服務調用bookWcfController控制器中的GetBooks方法 Object retdata = InvokeWCFService("bookWcfController", "GetBooks"); DataTable dt = ToDataTable(retdata); frmBook.loadbooks(dt); } //保存 public void bookSave() { //通過wcf服務調用bookWcfController控制器中的SaveBook方法,並傳遞參數Book對象 InvokeWCFService("bookWcfController", "SaveBook",frmBook.currBook); GetBooks(); } } }
bookwcfclientController對象必須繼承BaseWCFClientController對象,且它是與界面層在同一項目中,其他的配置如控制器對應的界面,對應的菜單都與Winform模式winController1控制器一樣,也依賴於IfrmBook接口;其實bookwcfclientController具有的功能與Winform的控制器一樣,只去掉了操作邏輯層的功能與增加了訪問wcfController控制器的功能。
講到這里不知道大家有沒有發現一點,就是從第二章的Web模式,第三章的Winform模式到本章WCF模式,項目的代碼文件都是共同使用的,比如第一章web模式中的實體和Dao,第二種Winform模式的界面文件和接口文件都是可以直接使用,並不需要任何一點點的改動,特別是Wcf模式完全可以兼容Winform模式的界面代碼;這就是EnterpriseFrameWork框架的特別之處,完全整合了這些模式在框架中;這樣在項目中我們可以根據具體情況可以很方便的調整開發模式,降低我們的開發成本。
再講一下WCF模式的由來,Winform模式是一種非常簡單的開發模式,目前大部分應用軟件項目基本上都是這樣做的,部署簡單,服務器裝上數據庫,程序安裝在客戶機上。不管開發還是實施都是直接干脆之極,讓中小企業在成本與人才各方面考慮都是用的最多的模式。雖然Winform模式簡單,但同樣也有問題,首先在安全上直接暴露了服務器與數據庫操作,再就是不太適合復雜的網絡環境,維護升級都極為不方便等。所以隨着項目的規模越來越大,一些系統架構上的調整也是必要的。
EnterpriseFrameWork框架中加入WCF開發模式就是基於這些方面的實際需求,所以怎樣才能最小代價的擴展成WCF模式,就是一直困擾我的問題,難道要把原有系統中的所有業務都重寫封裝成wcf服務?重寫的代價真的有點大,特別讓我接受不了的完全與框架的核心“簡潔”沖突了。也參考過其他公司的wcf框架,也是覺得可能把業務封裝成wcf服務太麻煩,所以干脆就是對數據庫的操作也就是DbHelper對象給用wcf服務封裝了,用wcf服務的方式操作數據庫,我就傻眼了。直到今年才找到如今這種方式,把Winform模式的控制器給拆分為wcfController和wcfclientController,兩個控制器之間用wcf服務通訊。
這也是一次讓我非常得意的改進,不知道大家用wcf做項目是一種什么樣的開發模式?
3.最后我們看下圖,整理一下以上代碼文件的調用關系
EnterpriseFrameWork框架實例源代碼下載: 實例下載