【问题标题】:Saving business rules per user保存每个用户的业务规则
【发布时间】:2011-05-04 09:19:48
【问题描述】:
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 列创建类。另一个建议是不要为所有属性创建一个分隔字符串,而应该有另一个表。每个属性都是它自己的行,与上表中的一行有外键关系。

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

【问题讨论】:

    标签: c# sql


    【解决方案1】:

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

    【讨论】:

    • 反序列化规则时,需要实例化XmlSerializer。 XmlSerializer 的构造函数需要一个类型。由于我将这些规则中的每一个都称为接口 (IRule),我如何知道我正在反序列化的类型?
    • 在设置 XmlSerializer 时,您可以拥有一个基本类型并指定所有允许的子类型。见msdn.microsoft.com/en-us/library/e5aakyae.aspx
    【解决方案2】:

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

    将检索到的数据存储到数据表中,或者在应用规则之前将它们转换为数据表。
    所以规则可以像普通的 sql 一样放在数据表的 filter 属性中。 您可以将其更改为包含
    column like '%foo%'

    的列,而不是规则名称和参数

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

    PS:我之前已经将 List 转换为 Datatable 并使用过这样的过滤器

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-28
        • 2010-12-25
        • 1970-01-01
        • 2012-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多