执行一组ValidationRule-C#类设计-更好的方法

执行一组ValidationRule-C#类设计-更好的方法,c#,.net,oop,architecture,class-design,C#,.net,Oop,Architecture,Class Design,我有一个案例,我需要为不同的公司执行一套验证规则。针对一家公司将有多个验证规则 所以我有下面的表结构 公司 ID CompanyName 1 ABC 2 DEF RuleID Name 1 Rule1 2 Rule2 MappingID CompanyId RuleID 1 1 1 2 1

我有一个案例,我需要为不同的公司执行一套验证规则。针对一家公司将有多个验证规则

所以我有下面的表结构

公司

ID CompanyName 1 ABC 2 DEF RuleID Name 1 Rule1 2 Rule2 MappingID CompanyId RuleID 1 1 1 2 1 2 3 2 2 ID公司名称 1 ABC 2 DEF 验证规则

ID CompanyName 1 ABC 2 DEF RuleID Name 1 Rule1 2 Rule2 MappingID CompanyId RuleID 1 1 1 2 1 2 3 2 2 规则ID名称 1规则1 2规则2 公司验证规则映射

ID CompanyName 1 ABC 2 DEF RuleID Name 1 Rule1 2 Rule2 MappingID CompanyId RuleID 1 1 1 2 1 2 3 2 2 MappingID公司ID规则ID 1 1 1 2 1 2 3 2 2 我对每个验证规则都有单独的存储过程

因此,从我的c#代码中,我将找到与公司对应的所有验证规则,并需要执行与该规则关联的验证存储过程

因此,我计划保留一个接口“IValidation”,它具有不同的验证方法

我是否必须为实现接口的每个验证创建不同的类


任何人都可以提出更好的方法。

有两种情况:

  • 如果所有Valudation SP具有相同的参数和结果,则可以创建一个类来调用所有SP,并将SP名称存储在CompanyValidationRuleMapping表中。看见

  • 如果每个SP都非常不同,则每个SP都需要不同的类


我建议使用相同的参数和结果创建所有SP,因为这种方法更易于扩展和更改。

您的第一级通用验证界面,它提供了提供结果类型和待验证模型的灵活性:

public interface IValidate<T, R>
    where T : class
    where R : class // where T is any custom result and R is your custom model
{
    T Validate(R model);
}
我的最终类,需要在执行验证后执行所有业务密集型操作:

public class XYZCompany
{
    private IValidateCompanyPolicies companyPoliciesValidation;

    private IValidateCompanyAccounts companyAccountsValidation;

    public XYZCompany(
        IValidateCompanyPolicies companyPoliciesValidation,
        IValidateCompanyAccounts companyAccountsValidation)
    {
        // Perform DI
    }

    public bool UpdateCompany(Company model)
    {
        var checkPolicies = this.companyPoliciesValidation.Validate(model);

        if (checkPolicies.Success)
        {
            var checkAccounts = this.companyAccountsValidation.Validate(model);

            var auditSuccess = this.companyAccountsValidation.HasAuditPassed(model);

            if (checkAccounts.Success && auditSuccess)
            {
                // Perform DB save
            }
        }
    }
}

请原谅我的无知,SP?CKK存储过程到底是什么?对于每个规则,您必须执行一个存储过程?@ATC..是..验证后,我需要发出不同的服务调用。我的疑问是类设计我不知道您的软件是如何设计的,或者我是否理解正确。是否正在验证数据库中已保存的实体?我认为验证最好放在1,在用户输入之后,在调用任何业务逻辑之前;2、在业务逻辑运行之后和保存到数据库之前。因此,要验证业务对象或实体,参数将是相同的。但它会返回不同的结果。对于每个实现IValidation的规则,单独的类会更好,验证的运行方式可能会改变(因为现在您使用的是SP,这本身可能会改变)而IValidation类的调用方只关心IValidation的底层方法返回了什么,它本身将包含有关验证结果的所有细节,不久前,我在一个使用很多规则的地方工作,在那里做大量维护的大多数人都非常擅长SQL而不是C,所以在这种情况下,拥有更多的SP而不是C类会更好。@RRM.非常感谢你的详细回答。。我试试这个