Csla架構之業務與驗證規則

來源:互聯網
上載者:User

  看時間還早,寫篇日誌消遣消遣。今天來回顧一下Csla架構中的業務與驗證規則,這個功能也是作者在架構中重 點實現的一個方面,意圖是在業務對象中以一種標準的方式來支援和處理資料有效性規則的驗證。(提前說明的一點是,學習此架構的首要目的是提高軟體開發思維能力,所以內容可能有些針對此架構,同時夾雜著個人想法,如有錯誤請指教。)

  前面在屬性聯想的章節中也提到在架構中對商務規則的驗證,是通過調用屬性set時架構自動觸發當前屬性的業務驗證規則;此外,在調用Factory 方法建立一個新對象時也可以顯示的調用CheckRules()方法來遍曆所有驗證規則,在特殊的屬性關聯時,也可以通過屬性名稱來調用其他屬性的驗證規則來實現驗證。

  對象規則定義的方法有兩種,一種被稱為每類型的規則,也就是同樣的物件類型只執行個體化一次商務規則,這樣會減少系統內在開支,也是架構預設的實現方法;另一種是每執行個體類型的規則,也就是建立新對象執行個體時就會為當前對象建立該對象的商務規則資訊,可想而之,有些對象的操作許可權會根據當前登陸使用者來決定,這種情況就會適用。
  在實現驗證規則時,作者引入了委託,也就是將驗證規則提升為了一定規則的物件類型,通過約定好的規則來定

義每類驗證方法,如必填項,數字範圍,複雜的可能還會對資料庫進行操作等,典型的方法簽名如下:

   1:  public delegate bool RuleHandler(object target, RuleArgs e);   
   2:  public delegate bool RuleHandler<T, R>(T target, R e) where R : RuleArgs;
 

可以看出它們的樣式特別像事件,其中第2行是實現的範型類型。這樣,開發人員就可以按規則定義自己的業務方法,再分配給需要規則定義的屬性。方法參數中的RuleArgs儲存屬性資訊及驗證結果描述資訊。

  另外一個輔助類是失效商務規則的跟蹤,它會存在於每個對象執行個體中(而且是在資料違背規則時才會初始化),當賦值操作違背商務規則時系統就會記錄當前的錯誤資訊,並通過錯誤處理介面向用戶端的資料繫結提供錯誤資訊(架構實現了資料繫結介面),當使用者更新失效資料時系統及時清除當前失效記錄。值得一提的是失效記錄會隨著N層撤銷功能一塊被拍照及撤銷,錯誤資訊也會是在對象儲存時系統判斷是否能儲存的重要依據。

  此功能使用了反射,這個應該不會是討論點了,常提到的系統效能與可擴充性及可維護性的權衡問題大家心裡都明白,這東西不能鑽牛角尖。

  在這裡也就是大體說一下,希望不會太讓大家失望。最後貼一個驗證規則範例(源於架構CommonRules類):

   1:          /// <summary>
   2:          /// Rule ensuring a string value contains one or more
   3:          /// characters.
   4:          /// </summary>
   5:          /// <param name="target">Object containing the data to validate</param>
   6:          /// <param name="e">Arguments parameter specifying the name of the string
   7:          /// property to validate</param>
   8:          /// <returns><see langword="false" /> if the rule is broken</returns>
   9:          /// <remarks>
  10:          /// This implementation uses late binding, and will only work
  11:          /// against string property values.
  12:          /// </remarks>
  13:          [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:ValidateArgumentsOfPublicMethods")]
  14:          public static bool StringRequired(object target, RuleArgs e)
  15:          {
  16:              string value = (string)Utilities.CallByName(
  17:                target, e.PropertyName, CallType.Get);
  18:              if (string.IsNullOrEmpty(value))
  19:              {
  20:                  e.Description = string.Format(Resources.StringRequiredRule, RuleArgs.GetPropertyName(e));
  21:                  return false;
  22:              }
  23:              return true;
  24:          }

 

 

使用方法也挺簡單,如下:

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            ValidationRules.AddRule(Csla.Validation.CommonRules.StringRequired, NameProperty);
        }
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.