c#处理复杂规则

时间:2016-06-21 03:55:40

标签: c# specification-pattern

我的情况是用户可以使用UI开发复杂的需求。具体而言,它涉及授权用户根据其资格执行某些工作。

例如,用户必须拥有;

  1. 所有这些: Qual1,Qual2,Qual3
    • 或(其中一个:(Qual4,Qual5) AND 所有这些: Qual11,Qual12,Qual13)
    • 其中一项或多项: Qual6,Qual7,Qual8
    • 其中一个: Qual9,Qual10
  2. 我已经查看了规范模式,但我不确定这是否是解决该问题的最佳解决方案。

    使用链接到Qualifications表的Authorization表和通过链接到Qualifications表的Training表进行的用户培训,将每个角色的要求存储在数据库中。

1 个答案:

答案 0 :(得分:1)

在代码中表示此类规则似乎很简单。首先,你做得太复杂了。 “和”和“所有”都只是“全部”,“一个或多个”和“或”都只是“任何”。所以你只需要几个谓词:

abstract class Requirement 
{
   abstract public bool Satisfied(User user);
}
sealed class Qual1 : Requirement { ... }
sealed class Qual2 : Requirement { ... }
...
sealed class All : Requirement 
{
   private IEnumerable<Requirement> r;
   public All(params Requirement[] r) { this.r = r; }
   public All(IEnumerable<Requirement> r) { this.r = r; }
   public override bool Satisfied(User user) {
     return r.All(x => x.Satisfied(user));
   }
}
sealed class Any : Requirement 
{
   ....

所以现在你只需说:

var q1 = new Qual1();
... etc ...
var rule =  All(
              Any(
                 All(q1, q2, q3), 
                 All(
                     Any(q4, q5), 
                     All(q11, q12, q13))), 
              All(
                Any(q6, q7, q8), 
                Any(q9, q10)));

现在你可以说:

if (rule(user)) ...

轻松自负。