今晚整理了一下前段時間做的一個小型工作流程應用程式,其核心的功能塊是用的Csla架構試用開發,今天就對Csla架構中的命令對象做下個人理解。
眾所周知,在工作流程的開發過程中,可以分為流程定義過程、流程運行過程和工作任務的跟蹤,特別是流程執行個體啟動並執行過程中,主要的實現可以總結為流程執行個體建立、任務提交、任務回退、辦結、抄送等等,其中的每個功能具有一定的相對獨立性,而且大多數的操作都是命令提交後一次性辦理,基於這種想法,自己在實現過程中對於上述的功能使用Csla架構的命令對象進行實現。
區別於Csla架構中的其他對象,可以說它的基本代碼塊是所有的物件類型中最簡單的,代碼中只有靜態Factory 方法及命令的執行代碼DataPortal_Execeut(),它可以存在於其他對象內部,作為內部類來被外層類調用,也可以公開類型被其他所有代碼使用,而且命令對象的初始化是在用戶端,所以可以在用戶端對命令對象及內部成員進行初始化,也可以在傳遞到服務端之前在用戶端進行資料的有效性驗證,其中運行在伺服器端的方法只有DataPortal_Execeut()。它可以只是一個簡單的進行一項資料個數的統計,也可以複雜到調用另外其他的N個類來實現此次命令操作,並且可以將操作的結果反應在欄位中供用戶端進行接收。下面就貼出一個簡化後的命令對象:
1: /// <summary>
2: /// 分發抄送資訊
3: /// </summary>
4: [Serializable]
5: public class ShareNode : Csla.CommandBase
6: {
7: //抄送的節點ID
8: private int _NodeID;
9:
10: //要抄送的使用者列表
11: private List<string> _ShareUser;
12:
13: private ShareNode(int nodeID, List<string> shareUser)
14: {
15: this._NodeID = nodeID;
16: this._ShareUser = shareUser;
17: }
18:
19: public static void Execute(int nodeID, List<string> shareUser)
20: {
21: ShareNode com = new ShareNode(nodeID, shareUser);
22: com = DataPortal.Execute<ShareNode>(com);
23: }
24:
25: protected override void DataPortal_Execute()
26: {
27: if (_NodeID == null || _NodeID <= 0 || _ShareUser == null || _ShareUser.Count <= 0)
28: {
29: return;
30: }
31: foreach (var item in _ShareUser)
32: {
33: ShareNode data = ShareNode.NewShareNode();
34: data.ID = _NodeID;
35: data.Date = DateTime.Now.ToString();
36: data.ShareUser = item;
37: data.ReadDate = DateTime.MaxValue.ToString();
38: data.State = false;
39: data.Type = ShareType.Node.ToString();
40:
41: data.Save();
42: }
43: }
44: }
上面是自己以前實現的一個簡單的流程抄送功能,其中,抄送的命令對象ShareNode是在用戶端調用Factory 方法進行執行個體化的,並且通過調用私人構造方法進行對欄位初始化(在執行個體化前可以對傳遞的參數進行驗證,避免到伺服器端後才發現初始化資料有誤)。調用執行個體的Execute方法執行個體對象的移動,在服務端(當然也可能是配置在本地)調用DataPortal_Execute方法,在內部實現自己需要實現的功能。在這裡只是一個簡單的資料操作,如果複雜的話命令對象還可能會返回更複雜的物件類型,無論是在用戶端還是在伺服器端還可能存在更複雜的業務代碼。
自己感覺,簡單的看它,它只是一個訪問遠程代碼的入口,就像是調用wcf其中一個方法那樣,但從它的名稱“命令對象”中看得出,作者將命令這種東西也作為了對象進行看待,就像是自己在實現工作流程中,其中每個命令都可以作為一個命令對象的方式存在,第一感覺就是清晰,無論命令對象裡面進行了如何複雜的代碼實現。可能需要注意的是命令的執行過程如果操作多次資料庫的話就需要將對象的方法標識為事務屬性以防萬一。
架構中的每種類型的對象都有其使用的條件,就像是這種命令對象,在處理命令操作中可以發揮出它的靈活性。
當然,這種用法是站在使用此架構的角度來思考,除此之外還有很多辦法可以實現,還有就是不同的情景對於一個架構來說也可能不適合。還是那句,用它,是為了在使用過程中學習更多的知識。
最後需要注意的是,在架構中,所有的業務對象,包括條件對象(Criteria) 都要標識為可序列化!這點我想在平常類的使用中也是要標識的...