Мне действительно нравятся «фильтры» в ASP.MVC. Они блестящие.
Я бы хотел использовать некий шаблон проектирования фильтров для своей бизнес-логики.
Рассмотрим следующее:
var shippingFilterCost = {
"Name": "CalculateShippingCostsFilter",
"InjectedServices": "product, shoppingBasket, CalculateProductShipping",
"MainMethod": function (product, shoppingBasket,CalculateProductShipping) {
var shippingCost = CalculateProductShipping(product.weight, shoppingBasket.locationToShipTo);
product.ShippingCost = shippingCost;
return product;
}
}
var checkIfBuyerHasAVouche = {
"Name": "CheckVoucher",
"InjectedServices": "product, shoppingBasket, CheckVoucherValid,CalculateVoucher",
"EntryCondition": function (product, shoppingBasket, CheckVoucherValid, CalculateVoucher) {
var isVoucherValid = CheckVoucherValid(shoppingBasket.voucherCode);
return isVoucherValid;
// we only go to the 'MainMethod' if entryCondition returns true;
},
"MainMethod": function (product, shoppingBasket, CheckVoucherValid, CalculateVoucher) {
var voucherPrice = CalculateVoucher(shoppingBasket.voucherCode);
product.voucherPriceReduction = voucherPrice;
return product;
}
}
Таким образом, у нас будет базовый продукт, и этот базовый продукт пройдет через те 2 фильтра, которые добавят «информацию к нему».
Один фильтр рассчитывает стоимость доставки, а другой - ваучер.
Преимущества:
1) По ссылкам мы можем легко увидеть, какие «службы» используются.
2) Мы можем легко отследить, какой метод легко изменяет какое свойство, потому что
3) Сервисы - это просто чистые методы, которые что-то возвращают.
4) Все мутации централизованы внутри основного метода
5) У нас также есть метод EntryCondition, который мы можем отделить и посмотреть, какие фильтры работают, а какие нет.
Я не уверен, как лучше объяснить, что здесь происходит. Очевидно, что эта логика очень проста, но если бы у меня было несколько поставщиков, типов клиентов и т. Д., У каждого из которых была своя логика, мы могли бы увидеть, как этот декларативный способ может помочь мне.
Если у вас есть идея, как я могу объяснить это лучше, отредактируйте мой пост.