我有這個課程,我們稱之爲退款(因爲這就是所謂的)。我想驗證一些關於退款及其所附的客戶的一些事情,並且我想讓這些驗證可以重新訂購,因爲第一個驗貨會作爲退款的拒絕原因存儲,而且其中一些是可能會比其他人更耗費資源,更可能會被絆倒,所以我希望能夠輕鬆地重新排序它們的執行次數,以便在需要時可以擠出一些性能。這是一個好主意的數據驗證設計嗎?
所有的驗證方法都會帶一個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;
}
}
我知道我有一個驗證器出現了多個回報!先發制人「放下我的後腿!」 – 2009-07-10 19:50:16