Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 设计模式建议:规则检查器_Asp.net_Design Patterns - Fatal编程技术网

Asp.net 设计模式建议:规则检查器

Asp.net 设计模式建议:规则检查器,asp.net,design-patterns,Asp.net,Design Patterns,我通过我的网站销售产品。最近,我们收到了一份规则清单,需要根据每个订单进行检查,以确保它不是欺诈性的。因此,此规则/欺诈指标列表将发生变化并不断增长,因此我希望确保其易于维护且确实可靠 我想我有一个抽象的类规则,每个规则都实现了它 abstract class Rule { public string Message; public bool Success; public void CheckOrder(OrderItem currentOrder); } class

我通过我的网站销售产品。最近,我们收到了一份规则清单,需要根据每个订单进行检查,以确保它不是欺诈性的。因此,此规则/欺诈指标列表将发生变化并不断增长,因此我希望确保其易于维护且确实可靠

我想我有一个抽象的
类规则
,每个规则都实现了它

abstract class Rule
{
    public string Message;
    public bool Success;
    public void CheckOrder(OrderItem currentOrder);
}

class FakeCreditCardNumberRule : Rule
{
   public string Message = "Fake CC Number Rule";
   public void CheckOrder(OrderItem currentOrder)
   {
       currentOrder.CreditCardNumber = "1234-5678-9012-3456";
       Success = false;
   }

}

class ReallyLargeOrderRule : Rule
{
   public string Message = "Really Large Order Rule";
   public void CheckOrder(OrderItem currentOrder)
   {
       currentOrder.ItemsOrder.Count > 100;
       Success = false;
   }

}
然后我考虑让一个类在它的构造函数中接受一个
Order对象
,并检查规则列表。比如:

class FraudChecker
{
    List<Rule> rules;

    public FraudChecker(OrderItem currentOrder)
    {
        foreach(var rule in rules)
        {
            rule.CheckOrder(currentOrder);
        }
    }
}
class-FraudChecker
{
列出规则;
公共欺诈检查程序(OrderItem currentOrder)
{
foreach(规则中的var规则)
{
规则.检查顺序(当前顺序);
}
}
}
因此,我试图想出最好的地方/最好的方法来填充欺诈检查程序 .规则列表,并开始思考可能会有一些很好的设计模式,可以像我正在做的那样

有人见过我应该在这里使用的设计模式吗?或者有人能想出一个好地方来填充这个列表吗


-Evan

您已经使用了Startegy模式。。。我相信工厂模式可以解决你的问题


我可能会使用自己的enum实现。我将创建这样一个类:

public sealed class Rules
{
    public static readonly Rule FakeCreditCardNumberRule = new FakeCreditCardNumberRule ();
    public static readonly Rule ReallyLargeOrderRule  = new ReallyLargeOrderRule  ();   
    //here I would write more

    private static readonly List<Rule> _all = List<Rule> { FakeCreditCardNumberRule, ReallyLargeOrderRule };
    //every time you add new rule to the class you have to add it to the _all list also

    public static IEnumerable<Rule> All
    {
        get
        {
            return _all;
        }
    }

    public static FraudChecker(OrderItem currentOrder)
    {
        foreach(var rule in All)
        {
            rule.CheckOrder(currentOrder);
        }
    }
}
Rules.FraudChecker(currentOrder);

您可以将每个新规则添加到Rules类中。您还可以在其中创建只处理部分规则的新方法,依此类推。

规范模式 我一直在处理一个非常类似的问题

我发现这个方法特别有用

对我来说,模式的主要好处是它结合了链接的方式

上面的链接提供了一个基本概述,文章中的相关链接也很有用。之后,如果您进行更多搜索,您将找到更详细的示例

Rules.FakeCreditCardNumberRule.CheckOrder(currentOrder);