<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      和我一起學(xué)CSLA.NET----創(chuàng)建業(yè)務(wù)對象3

            到現(xiàn)在為止, 我們已經(jīng)為業(yè)務(wù)對象創(chuàng)建了屬性,驗證規(guī)則,數(shù)據(jù)門戶.除了屬性我們會直接使用,驗證規(guī)則和數(shù)據(jù)門戶我們不會手動直接調(diào)用的,而最通常調(diào)用的是我們的業(yè)務(wù)對象的工廠方法,在這一節(jié),我們就為Product對象添加了些通用的工廠業(yè)務(wù)方法,并且介紹一下工廠方法調(diào)用的內(nèi)部細節(jié),以及業(yè)務(wù)對象的相關(guān)細節(jié)。
            首先我們必須要了解一下業(yè)務(wù)對象的Save方法,這個方法是CSLA約定的基本業(yè)務(wù)對象BusinessBase<T>內(nèi)置實現(xiàn)的,源代碼如下:

      隱藏行號 復(fù)制代碼 BusinessBase.Save
      1. public virtual T Save()
      2. {
      3.   T result;
      4.   if (this.IsChild)
      5.     throw new NotSupportedException(Resources.NoSaveChildException);
      6.   if (EditLevel > 0)
      7.     throw new Validation.ValidationException(Resources.NoSaveEditingException);
      8.   if (!IsValid && !IsDeleted)
      9.     throw new Validation.ValidationException(Resources.NoSaveInvalidException);
      10.   if (IsBusy)
      11.     throw new Validation.ValidationException(Resources.BusyObjectsMayNotBeSaved);
      12.   if (IsDirty)
      13.     result = (T)DataPortal.Update(this);
      14.   else
      15. result = (T)this;
      16.   OnSaved(result, null, null);
      17.   return result;
      18. }

           前幾個判斷和異常我們暫且不管,我們看到當(dāng)屬性IsDirty為True時,會調(diào)用數(shù)據(jù)門戶的Update(以下是此方法代碼片斷),而在Update方法內(nèi)部,CSLA其實是會根據(jù)當(dāng)前業(yè)務(wù)對象不同的狀態(tài)進行不同的處理,如果業(yè)務(wù)對象是新增對象(IsNew=True),則通過反射調(diào)用業(yè)務(wù)對象的DataPortal_Insert方法,如果為已經(jīng)標記刪除的對象(IsDeleted=True),則調(diào)用對象的DataPortal_DeleteSelf方法,否則調(diào)用業(yè)務(wù)對象的更新方法DataPortal_Update, 以下就是DataPortal.Update方法的內(nèi)部代碼片斷:

      隱藏行號 復(fù)制代碼
      1.    string methodName;
      2.           if (obj is CommandBase)
      3.           {
      4.             //注意這里的方法名都是寫死的,這和基類BusinessBase里定義的一致,所以數(shù)據(jù)門戶的方法名是固定的
      5. methodName = "DataPortal_Execute";
      6.             operation = DataPortalOperations.Execute;
      7.             //反射之前會進行權(quán)限判斷
      8. if (!Csla.Security.AuthorizationRules.CanEditObject(objectType))
      9.               throw new System.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException,
      10.                 "execute",
      11.                 objectType.Name));
      12.           }
      13.           else
      14. {
      15.             var bbase = obj as Core.BusinessBase;
      16.             if (bbase != null)
      17.             {
      18.               if (bbase.IsDeleted)
      19.               {
      20.                 methodName = "DataPortal_DeleteSelf";
      21.                 if (!Csla.Security.AuthorizationRules.CanDeleteObject(objectType))
      22.                   throw new System.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException,
      23.                     "delete",
      24.                     objectType.Name));
      25.               }
      26.               else
      27.                 if (bbase.IsNew)
      28.                 {
      29.                   methodName = "DataPortal_Insert";
      30.                   if (!Csla.Security.AuthorizationRules.CanCreateObject(objectType))
      31.                     throw new System.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException,
      32.                       "create",
      33.                       objectType.Name));
      34.                 }
      35.                 else
      36. {
      37.                   methodName = "DataPortal_Update";
      38.                   if (!Csla.Security.AuthorizationRules.CanEditObject(objectType))
      39.                     throw new System.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException,
      40.                       "save",
      41.                       objectType.Name));
      42.                 }
      43.             }
      44.             else
      45. {
      46.               methodName = "DataPortal_Update";
      47.               if (!Csla.Security.AuthorizationRules.CanEditObject(objectType))
      48.                 throw new System.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException,
      49.                   "save",
      50.                   objectType.Name));
      51.             }
      52.           }
      53.           method = Server.DataPortalMethodCache.GetMethodInfo(obj.GetType(), methodName);
      54.         }
      55.        //...下面是調(diào)用這個方法了
      56. 
        

           這里列出來了比較多的代碼,其實這也是一種學(xué)習(xí)CSLA框架的一個手段,他的源代碼并不是很復(fù)雜,結(jié)合著實例去學(xué)習(xí)他的源代碼對我們能夠很好的使用這個開源框架很有幫助. 很多問題只有你知道了它的具體原理,你才能夠真正的去充分利用它的價值,也就會避免來濫用它.不要迷戀它,也不能低估它.
            以上之所以介紹業(yè)務(wù)對象的Save方法,是想說明,在這個方法內(nèi)部已經(jīng)提供了業(yè)務(wù)對象的更新,延遲刪除,保存,所以說我們工廠方法沒有必要提供這三個方法了,這樣我們暫時不考慮業(yè)務(wù)直接相關(guān)的方法,還差創(chuàng)建對象,直接刪除,獲取對象三個方法了,我們依次添加這三個方法: 

      隱藏行號 復(fù)制代碼 Factory Methods
      1. #region  Factory Methods
        
      2. 
        
      3. public static Product NewProduct()
        
      4. {
        
      5.     return DataPortal.Create<Product>();
        
      6. }
        
      7. public static Product GetProduct(string id)
        
      8. {
        
      9.     return DataPortal.Fetch<Product>(new SingleCriteria<Product, string>(id));
        
      10. }
        
      11. public static void DeleteProduct(string id)
        
      12. {
        
      13.     DataPortal.Delete(new SingleCriteria<Product, string>(id));
        
      14. }
        
      15. private Product()
        
      16. { }
        
      17. 
        
      18. #endregion
        

            1.首先是創(chuàng)建對象的方法NewProduct(),可能有些人可能會不太明白這個方法為什么存在,CSLA約定所有業(yè)務(wù)對象實現(xiàn)非public構(gòu)造函數(shù),防止用戶new一個業(yè)務(wù)對象,強制UI開發(fā)人員使用工廠方法來使用業(yè)務(wù)對象,可以看到我們最下面的默認構(gòu)造方法都是私有的,你不能夠在外面直接通過new來創(chuàng)建我們的業(yè)務(wù)對象.
            2.業(yè)務(wù)方法調(diào)用的數(shù)據(jù)門戶相應(yīng)的實現(xiàn),其實就和業(yè)務(wù)對象的數(shù)據(jù)門戶的方法一一對應(yīng),這個我們在上一節(jié)有介紹,比如這里調(diào)用的DataProtal.Create其實就是調(diào)用的我們的業(yè)務(wù)對象內(nèi)部實現(xiàn)的DataPortal_Create,只不在調(diào)用時自動封裝了上下文,進行了通道處理,進行了安全驗證.
            3.業(yè)務(wù)方法都是static的靜態(tài)方法.

            到現(xiàn)在為止,我們已經(jīng)完成了一個基本的業(yè)務(wù)對象,包括它的屬性,驗證,數(shù)據(jù)門戶,業(yè)務(wù)方法,現(xiàn)在可以對我們的業(yè)務(wù)對象進行一下測試了,很簡單,我們使用Vs.Net帶的單元測試,新建一個測試項目, 然后注意新增一個配置文件來配置我們的數(shù)據(jù)庫連接, 再添加我們針對Product業(yè)務(wù)對象的單元測試類即可了,我們先簡單的測試一下創(chuàng)建和保存方法:

      隱藏行號 復(fù)制代碼 Test
      1. 
        
      2. /// <summary>
        
      3. ///NewProduct 的測試
        
      4. ///</summary>
        
      5. [TestMethod()]
        
      6. public void NewProductTest()
        
      7. {
        
      8.     Product actual;
        
      9.     actual = Product.NewProduct();
        
      10.     actual.ItemNo = "000001";
        
      11.     actual.ItemName = "山寨手機Nexus one";
        
      12.     Assert.IsNotNull(actual.ProductID);
        
      13. }
        
      14. 
        
      15. [TestMethod()]
        
      16. public void SaveProductTest()
        
      17. {
        
      18.     Product actual;
        
      19.     actual = Product.NewProduct();
        
      20.     actual.ItemNo = "000001";
        
      21.     actual.ItemName = "山寨手機Nexus one";
        
      22.     actual.Save();
        
      23. 
        
      24.     Product expected = Product.GetProduct(actual.ProductID);
        
      25.     Assert.IsNotNull(expected);
        
      26.     Assert.AreEqual(actual.ItemNo, expected.ItemNo);
        
      27. }
        

           右擊運行單元測試,我們可以直接查看測試結(jié)果,直接測試我們的業(yè)務(wù)對象的相關(guān)特性,或者是調(diào)試過程來查看一些內(nèi)部流程.

           接下來,還是來提示一些業(yè)務(wù)對象的一些使用上的細節(jié):
           1.當(dāng)使用工廠方法NewXXX創(chuàng)建一個對象后,在DataPortal_Create里對這個對象的默認值進行初始化,對象的屬性IsNew=True,然后需要調(diào)用業(yè)務(wù)對象內(nèi)置的Save方法,才保存這個對象
           2.如果你調(diào)用業(yè)務(wù)對象內(nèi)置的Delete()方法,其實是設(shè)置這個業(yè)務(wù)對象的IsDeleted=True,IsDirty=True,然后需要調(diào)用業(yè)務(wù)對象內(nèi)置的Save方法,來完成這個對象的持久化,這就是我們提到過的延遲刪除(也可以通過查看我們上面提到的Save方法的內(nèi)部處理看出來).
           3.如果你調(diào)用業(yè)務(wù)對象內(nèi)置的Save方法,對象不是是以上說的兩種情況,而且進行過更改,屬于臟對象(IsDirty=True),那么會執(zhí)行這個對象的更新操作,也就是會調(diào)用數(shù)據(jù)門戶提供的DataPortal_Update方法.
         
        不過我們的業(yè)務(wù)對象還比較簡單,到現(xiàn)在并沒有考慮到主子關(guān)系,也沒有處理安全驗證,更沒有應(yīng)用CSLA的移動對象,這些概念我們會在下面一一介紹.

       代碼下載

      作者:孤獨俠客似水流年
      出處:http://lonely7345.cnblogs.com/
      本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。

      posted @ 2010-02-08 16:46  孤獨俠客  閱讀(5890)  評論(13)    收藏  舉報
      主站蜘蛛池模板: 肇州县| 亚洲国产精品一区二区三| 亚洲国产午夜精品理论片在线播放 | 国产一区二区午夜福利久久| 好吊视频一区二区三区人妖| 国产线播放免费人成视频播放| 亚洲中文字幕av无码区| 丰满的人妻hd高清日本| 国产一区二区三区在线观看免费 | 99亚洲男女激情在线观看| 国产视频有码字幕一区二区| 一二三四免费中文字幕| 贵定县| 国产精品免费AⅤ片在线观看 | 亚洲高潮喷水无码AV电影| 国产精品天天看天天狠| 日韩亚洲精品国产第二页| 亚洲精品欧美综合二区| 国产精品免费AⅤ片在线观看| 日韩免费美熟女中文av| 国产99视频精品免费观看9| 国产精品无码素人福利不卡| 国产精品日韩av一区二区| 亚洲a人片在线观看网址| 亚洲高潮喷水无码AV电影| 亚洲男人av天堂久久资源| 人妻va精品va欧美va| 国内精品久久久久电影院| 国产精品中文av专线| 丁香色婷婷国产精品视频| 亚洲嫩模一区二区三区| 久久SE精品一区精品二区| 国产对白老熟女正在播放| 久久这里只精品热免费99| 中文国产乱码在线人妻一区二区| 无码囯产精品一区二区免费| 亚洲精品成人久久av| 俺来也俺去啦最新在线| 国产AV无码专区亚洲AV漫画| 亚洲一区二区三区人妻天堂| 亚洲综合伊人久久大杳蕉|