c# - 过滤器设计模式
问题描述
我真的很喜欢 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;
}
}
所以我们将有一个基础产品,该基础产品将通过这两个过滤器,将添加“信息”。
一个过滤器计算运费,另一个过滤器计算凭证。
优点:
1)我们可以很容易地通过他们的引用看到在哪里使用了哪些“服务”。
2)我们可以很容易地跟踪什么方法改变了什么属性,因为
3)服务只是返回一些东西的纯方法。
4)所有的突变都集中在mainMethod内部
5)我们还有“EntryCondition”方法,我们可以分离并查看哪些过滤器运行,哪些过滤器不运行。
我不确定如何更好地解释这里发生的事情。显然这个逻辑非常简单,但如果我有多个供应商、客户类型等,每个都有自己的逻辑,我们可以看到这种声明性方式如何帮助我。
如果您有更好的想法,我该如何更好地解释这一点,请编辑我的帖子。
解决方案
推荐阅读
- android - 使用不同样式的文本绘制自定义视图或按钮
- ios - 使用地理位置查找 ios 设备当前位置
- python - 比较两个数据框中的值
- javascript - 如何从“滑动滑块同步”中删除滑块导航并显示缩略图?
- forms - 自动接线似乎不起作用
- python - 如何检查数据框中每个值消耗的位数
- android - 如何确定内容的实际 MIME 类型?
- php - 基于 Laravel (ORM) 中的表关系获取带有额外标志字段的数据
- php - 寻找
(paragraph) 带有特定类的标签并使用 PHP Simple HTML DOM Parser 提取其内容
- laravel - 指定自定义表名并在模型上设置条件 | 拉拉维尔