首页 > 解决方案 > 过滤器设计模式

问题描述

我真的很喜欢 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”方法,我们可以分离并查看哪些过滤器运行,哪些过滤器不运行。

我不确定如何更好地解释这里发生的事情。显然这个逻辑非常简单,但如果我有多个供应商、客户类型等,每个都有自己的逻辑,我们可以看到这种声明性方式如何帮助我。

如果您有更好的想法,我该如何更好地解释这一点,请编辑我的帖子。

标签: c#.netasp.net-mvcoopdesign-patterns

解决方案


推荐阅读