先說下,這是最近自己在嘗試著應用CSLA來開發一個簡單的藥品進銷存系統(winform)過程中遇到的一些情況,也有很多想到的問題和思路,僅供大家娛樂性瀏覽,也並沒有什麼科學依據,算是個嘗試吧!在文中不僅是單獨寫架構應用,更多的是自己在從中發現的或者使用的其思想。
先不談技術,先談下自己對這個架構小小的理解。
物件導向的抽象、封裝、繼承、多態想必大家整天掛在嘴邊了,如果單單從這幾個詞來理解感覺真是很抽象,或者它們的這種概括性實在太強,所以拿一個好的架構來學習和理解它們會更好一些,當然除了理論外實際的開發經驗是非常重要的,感覺它們就像是無底洞,永遠摸不清到底有多深...這個架構也充分的體現和應用了物件導向的這幾大概念。
(業務對象)Business object的概念是從05這本書上看到的,也體現了CSLA架構面向的客戶--業務,對於開發中常用到的一些功能都封裝在了基類中,業務開發人員可以把精力集中在業務對象的建立以及業務的處理上,經過這個小系統的開發嘗試確實也體會到了,裡面的一些功能,比如資料繫結,對象的狀態跟蹤,資料驗證,撤銷等,雖然這些東西在微軟產品中也有體現,但都是零散的。而且這幾項功能不是獨立存在的,而是相互之間存在著關係,下面就先從這幾方面談談感受。。
資料繫結,記得剛開始學.net時就是從這個開始的,點點拖拖就實現了資料的增刪改,綁定機制非常強大,而在之後的應用開發中發現這種綁定只限於簡單的,或者說業務比較簡單的處理,如果是複雜的話就無用武之地,但在這裡也強調了資料繫結,也是無用的嗎?不是,在這裡就強調業務對象並非只是資料的簡易對應,而充滿活力的業務資料,比如說,產品與類別,產品中會存在類別ID,但不可能給使用者顯示這個無法理解的字元,所以在業務對象中它會以產品類別引用的方式存在,在普通的處理中是以視圖的方式查詢,而在這裡強調的是對象,向View提供的智能對象(加工過的資料),所以資料繫結依然有效,而且資料繫結一般會是雙向的,無論是綁定介面的修改還是業務對象的修改,它都會做一個顯示與資料的統一,在這裡存在的問題作者也以控制項的形式做了彌補,這種好處之一就是你可以盡情操作你的對象,而不用去管視圖的顯示(現在是這麼回事,不知道複雜的會怎樣),所有的這些都會發生在PropertyChange裡面。
狀態跟蹤,每一種對象(非唯讀對象)都會跟蹤自己對象的狀態,無論是複雜物件還是單一可編輯對象,而複雜的組合對象的狀態跟蹤也是由其子物件的狀態來決定。狀態的跟蹤包括IsNew,IsDirty,IsDelete以及一些組合狀態組成,對象從建立開始到持久化,這個過程的操作都是由這些狀態來決定,所以它們的正確性非常重要,這裡自己也遇到過問題,比如,在對象建立時對象應該肯定是新的,在2.0裡面是通過欄位域的賦值來實現,所以這種賦值並不會觸發對象屬性的setter,也不會觸發makeold這種方法,在3.8裡面這種賦值可以使用BypassPropertyChecks或者是SetProperty這種方法來實現,但存在的問題就是對象的初始化必須存在於對象內部,如果建立對象時一些屬性需要由外界來決定的話就需要對Factory 方法以及重載DataPortal_Create參數來進行參數設定(現在還沒想出別的方法),否則如果在用戶端進行屬性設定的話對象的狀態就不理想了,而且執行撤銷功能時對象就"壞"了,在更新屬性架構內部會判斷當前的值是不是新的,如果是新的它就會標識對象為髒對象,在最後Save時會根據當前對象的狀態來決定觸發哪個資料門戶方法。
資料驗證,在書中就討論了程式中驗證規則的放置方式,可以說它無處不在,特別是這裡說的驗證規則不包含web中用戶端這種無法信賴的驗證,所以這種資料驗證會存在於用戶端與服務端,架構通過移動對象的概念解決了這種規則共用,而且對驗證規則進行了抽象,每個業務對象進行了統一的管理,在2.0以是要手動觸發PropertyHasChanged方法來觸發,以以上版本中就直接封裝在上基類中,上面也提到了如何不觸發這種驗證。與綁定機制的關係,在綁定資料中觖發修改後會擷取是否有錯誤資訊,架構在基類中繼承了IDataErrorInfo以及屬性更新(具體那個長的忘了怎麼寫)介面。
撤銷,這個功能是我開始學習此架構的主要原因,感覺很爽,開放給使用者的就三個方法:拍快照,同意上一次修改,撤銷上一次修改。當然這個功能對於web來說肯定不行了,撤銷的過程中也會更新對象當前驗證狀態/錯誤清單以及對象狀態資訊。不過這裡存在一個問題,就是沒有找著一個Apply是把所有快照都刪除的,所以要同意了所有的快照後才可以儲存,這裡好像有一個level的屬性來儲存快照深度,在儲存的時候它判斷了是否存在快照,在這裡自己也擴充了一個IsUndoable的是否可撤銷屬性,感覺可以用它來控制按鈕狀態什麼的,不知道是否合理...
以上是剛想到的一些,自己也是想到哪寫到哪,有誤的地方大家千萬別信...