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列创建类。另一个建议是,不是为所有属性创建分隔字符串,而是会有另一个表。每个属性都是它自己的行,其外键关系回到上表中的一行。
但是,这两个示例似乎都不是保存这些规则的最佳方法。有一个更好的方法吗?
答案 0 :(得分:1)
为什么不使用XML序列化。数据库表将包含User#和单个规则的XML序列化。
答案 1 :(得分:0)
我相信你是从数据库中检索的 如果是这样,请尝试我的建议。
将检索到的数据存储到数据表中,或在应用规则之前将其转换为数据表
因此规则可以作为普通的sql放在datatable的filter属性中。
您可以将其更改为包含
的列,而不是规则名称和参数
column like '%foo%'
然后将其应用于数据表的过滤器。
PS:我已将List转换为Datatable并在
之前使用了这样的过滤器答案 2 :(得分:0)
在我看来,简单地说,您需要将对象映射到SQL表(如果只有一种技术可以自动执行此操作......)。
根据您发布的内容,我设想至少有六个SQL表,如果还有其他规则的子类,则设置更多
它们是否是不同的表可能受规则是否相互关联的影响,例如如果MinLengthRule
的{{1}}值不能超过其Ruleset
值,那么当它们位于不同的表中时,您可能会发现很难编写SQL约束来验证它。