2009-07-10 75 views
1

我有這個課程,我們稱之爲退款(因爲這就是所謂的)。我想驗證一些關於退款及其所附的客戶的一些事情,並且我想讓這些驗證可以重新訂購,因爲第一個驗貨會作爲退款的拒絕原因存儲,而且其中一些是可能會比其他人更耗費資源,更可能會被絆倒,所以我希望能夠輕鬆地重新排序它們的執行次數,以便在需要時可以擠出一些性能。這是一個好主意的數據驗證設計嗎?

所有的驗證方法都會帶一個Refund對象並返回一個布爾值,表示驗證是否通過或失敗。所以,我想,爲什麼不建立一個隊列(或其他數據結構)來保存代表/ lambda表達式/匿名函數,每個代表一個驗證方法?然後,只需將Refund傳遞給某個Validator類中的某種靜態Validate(Refund refundToValidate)方法即可。這個方法會遍歷代理數組,依次調用每個代理,如果其中一個產生錯誤,則返回false。

這是一個好主意還是一個愚蠢的想法?如果這是一個好主意,你能指點我一個資源或者指定一個我無意實現的模式,這樣我就知道我做對了嗎?如果這是一個愚蠢的想法,爲什麼和我應該做什麼不同?

編輯:這裏就是我有這麼遠

public static class Validator 
    { 


     delegate REFUNDDENIALREASONS validationHandler(BatchRefund refundToValidate); 

     public static List<REFUNDDENIALREASONS> ValidateRefund(BatchRefund refundToValidate) 
     { 
      List<Delegate> Validations = new List<Delegate>(); 
      List<REFUNDDENIALREASONS> DenialReasons = new List<REFUNDDENIALREASONS>(); 

      Validations = new List<Delegate>(); 

      validationHandler blockHandler = ValidateBlocks; 
      Validations.Add(blockHandler); 

      validationHandler accountHandler = ValidateCustomerAccountStatus; 
      Validations.Add(accountHandler); 

      foreach (validationHandler v in Validations) 
      { 
       DenialReasons.Add(v(refundToValidate)); 
      } 

      return DenialReasons; 
     } 

     public static REFUNDDENIALREASONS ValidateCustomerAccountStatus(BatchRefund refundToHandle) 
     { 
      REFUNDDENIALREASONS denialReason; 

      switch (refundToHandle.RefundCustomer.CustStatus) 
      { 

       case "C": 
        denialReason = REFUNDDENIALREASONS.None; 
        break; 
       case "Y": 
        denialReason = REFUNDDENIALREASONS.AccounthasrecentChargebackNSF; 
        break; 
       default: 
        denialReason = REFUNDDENIALREASONS.Fraud; 
        break; 
      } 

      return denialReason; 

     } 

     public static REFUNDDENIALREASONS ValidateBlocks(BatchRefund refundToHandle) 
     { 
      List<CustomerBlock> blocks = refundToHandle.RefundCustomer.Blocks; 
      //add new codes to block here 
      string[] illegalblockcodes = new string[] { "L1", "C1" }; 

      foreach (string code in illegalblockcodes) 
       if (blocks.Exists(b => b.BkClassCode == code)) 
       { 
        return REFUNDDENIALREASONS.Fraud; 
       } 

      return REFUNDDENIALREASONS.None; 

     } 
    } 
+0

我知道我有一個驗證器出現了多個回報!先發制人「放下我的後腿!」 – 2009-07-10 19:50:16

回答

1

你基本上描述了對Chain-of-responsibility設計模式的調整。這有好處和壞處,但如果您希望在任何時間點向您的隊列添加其他操作的靈活性,這是一個不錯的選擇。

0

不一定是一個壞主意。你打算跟蹤哪些驗證失敗?如果你使用一個靜態方法來通過一個隊列來運行它,你將如何告訴?

+0

哦,好的電話。也許我可以返回一些比布爾值更有趣的東西... – 2009-07-10 18:09:25

+0

也許是一些通用ValidationFailed項目的列表。 – 2009-07-10 18:31:28

+0

我決定在列表其中REFUNDDENIALREASONS是明顯的枚舉。 – 2009-07-10 19:22:40

相關問題