在数据库中保存验证规则

Save validation rules on database

我不确定我的问题是什么,但我会尽力解释。

考虑到域模型中的每种类型都将成为规则或验证(或其他)策略,将这些验证器持久化在数据库上有什么问题?

例如:

有以下型号

public Class Contract
{
    ...
    public ContractType Type {get;set;}

    public bool Validate(){
        return Type.Validate(this);
    }
}

public abstract class ContractType
{
    public int Id{ get; set; }
    public string Description{ get; set; }

    public abstract bool Validate(Contract contract);
}

public Class PreSale : ContractType
{
    public override bool Validate(Contract contract)
    {
        //here goes specific validation for PreSale
    }
}

public Class HighRiskSale : ContractType
{
    public override bool Validate(Contract contract)
    {
        //here goes specific validation for HighRiskSale
    }
}

public Class AprovedSale : ContractType
{
    public override bool Validate(Contract contract)
    {
        //here goes specific validation for AprovedSale
    }
}

我将使用 Table 每层级方法来管理具体验证器

这是一种该死的方法吗?

做起来有什么问题?

已更新

有人告诉我的主要论点是我应该有一个简单的结构并从 DI 容器或服务定位器中获取规则,但我不喜欢在我的域模型上使用服务定位器。

提前致谢

我没有发现使用 TPH 方法有任何问题,所以.. 为什么不呢?

它很简单,似乎符合您模型背后的语义。

只有当你认为那些 类 将包含许多不会在它们之间共享的特定属性并且你认为它最终会占用很多 [=16] 时,我才会考虑另一种方法=] 在磁盘上,或者如果您必须在这些字段上定义空约束。

我认为这里的主要问题是谁在维护规则。如果用户维护合同和每个合同的验证规则,那么您甚至可能没有 ApprovedSales class,而是名称为 "Approved Sale" 的合同类型 class 的实例 如果你这样做,将验证规则存储在数据库中很有意义(尽管要小心,如果你的验证规则变得复杂,那么将它们存储在数据库中也是如此)

如果合同类型是固定的,并结合了验证规则,那么只需将它们写成 linq 查询(或者您想要编写验证的任何方式)并对其进行硬编码。

如果您确实想要存储验证器,您甚至可以考虑将它们存储为 json 对象。传统数据库工作不佳的原因是,如果我有 2 个验证,比如年龄 > 18 和名字至少 4 个字母并且只有 a-z,那么我必须在数据库中存储非常不同的东西。如果我使用 TPH 方法,我可能有一个属性名(年龄、名字)、数字(18、4)和 allowedCharacters (a-z) 字段。但是现在您已经看到数字字段在两种验证中的使用方式非常不同。所以我得到 2 个数字字段,其中 1 个总是空的..... 数据库当然可以处理这个但是 json 序列化甚至可以更快地到达那里(如果你想存储它)如果它不仅仅将它们编码出来可能对您的客户来说已经足够好了(即使从现在起 2 年后他想更改合同,那么您将花费 2 小时来更改代码,而不是现在花费 2 小时来获取数据库结构设置)