保存每个用户的业务规则

时间:2011-05-04 09:19:49

标签: c# sql

public interface IRule
{
    bool Check(string input);
}

我有一个定义规则的界面。规则只是用户可以创建的通用业务规则或约束。所以我有两个示例规则:

public class ContainsRule : IRule
{
    public string MustContain { get; set; }

    public bool Check(string input)
    {
        return input.Contains(this.MustContain);
    }
}

public class LengthRule : IRule
{
    public int MaxLength { get; set; }

    public bool Check(string input)
    {
        return input.Length <= this.MaxLength;
    }
}

规则可能有多个可设置的属性,但在此示例中,每个规则只有一个属性。

用户可以创建自己应该保存的规则集。例如,用户有以下三个规则:

IRule[] rules = new IRule[]
{
    new ContainsRule { MustContain = "foo" },
    new ContainsRule { MustContain = "bar" },
    new LengthRule { MaxLength = 5}
};

我需要将此信息保存到每个用户的数据库或某个数据存储中。由于每个用户都可以拥有自己的一套规则,因此我不确定数据库表应该是什么样子。

User  |  ClassName               |  Parameters
-----------------------------------------------
1     |  Namespace.ContainsRule  |  MustContain:foo
1     |  Namespace.ContainsRule  |  MustContain:bar
1     |  Namespace.LengthRule    |  MaxLength:5

我最初的猜测是创建一个类似于上面的表,其中参数应该是一个字符串。这意味着我需要解析信息并使用反射或其他东西来设置属性。我需要使用激活器使用ClassName列创建类。另一个建议是,不是为所有属性创建分隔字符串,而是会有另一个表。每个属性都是它自己的行,其外键关系回到上表中的一行。

但是,这两个示例似乎都不是保存这些规则的最佳方法。有一个更好的方法吗?

3 个答案:

答案 0 :(得分:1)

为什么不使用XML序列化。数据库表将包含User#和单个规则的XML序列化。

答案 1 :(得分:0)

我相信你是从数据库中检索的 如果是这样,请尝试我的建议。

将检索到的数据存储到数据表中,或在应用规则之前将其转换为数据表 因此规则可以作为普通的sql放在datatable的filter属性中。 您可以将其更改为包含
的列,而不是规则名称和参数    column like '%foo%'

然后将其应用于数据表的过滤器。

PS:我已将List转换为Datatable并在

之前使用了这样的过滤器

答案 2 :(得分:0)

在我看来,简单地说,您需要将对象映射到SQL表(如果只有一种技术可以自动执行此操作......)。

根据您发布的内容,我设想至少有六个SQL表,如果还有其他规则的子类,则设置更多

  • 规则
  • MustContainTextRules(规则的子类,1:0..m)
  • MaxLengthRules(规则的子类,1:0..1)
  • [可能进一步的规则子类,例如MinLengthRules?]
  • 规则集(“一套规则”)
  • 用户
  • RulesetOwnership(用户和规则集之间的关系表)

它们是否是不同的表可能受规则是否相互关联的影响,例如如果MinLengthRule的{​​{1}}值不能超过其Ruleset值,那么当它们位于不同的表中时,您可能会发现很难编写SQL约束来验证它。