У меня есть этот класс, давайте назовем его Refund (потому что так он называется). Я хочу проверить некоторые сведения об этом Возврате и о клиенте, к которому он привязан, и я хочу сделать эти проверки переупорядочиваемыми, потому что первые, которые отключаются, будут сохранены как причина отклонения при Возврате, а также некоторые из вероятно, будет более ресурсоемким, чем другие, и с большей вероятностью будет отключен, поэтому я хотел бы иметь возможность легко изменить порядок их выполнения, чтобы при необходимости можно было снизить производительность.
Все методы проверки возьмут объект Refund и вернут логическое значение, обозначающее, прошла ли проверка или нет. Итак, я подумал, почему бы не создать очередь (или другую структуру данных) для хранения делегатов / лямбда-выражений / анонимных функций, каждая из которых представляет метод проверки? Затем, просто передав Refund в некоторый статический метод Validate (Refund refundToValidate) в некотором классе Validator. Этот метод будет проходить через массив делегатов, вызывая каждого из них по очереди и возвращая false, если один из них выдаст 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;
}
}