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

Execute Set of ValidationRule-C# Class Design - Better Approach

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

所以我有以下table结构

公司

ID      CompanyName  
1       ABC   
2       DEF  

验证规则

RuleID      Name  
1           Rule1   
2           Rule2 

CompanyValidationRuleMapping

MappingID      CompanyId    RuleID
1              1             1
2              1             2
3              2             2

我对每个验证规则都有单独的存储过程。

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

所以我打算保留一个具有不同验证方法的接口 'IValidation'。

我是否必须为每个实现接口

的验证创建不同的 类

谁能就此提出更好的方法。

有两种情况:

  • 如果所有 Valudation SP 具有相同的参数和结果,您可以创建一个 class 来调用所有 SP 并将 SP 名称存储在 CompanyValidationRuleMapping table.看 Called SP from another SP

  • 如果每个 SP 都非常不同,那么每个 SP 都需要不同的 class

我建议使用相同的参数和结果创建所有 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);
}

比方说,我需要验证将完全由不同的 sp 处理的公司政策:

public interface IValidateCompanyPolicies : IValidate<ValidationResult1, Company>
{
  ValidationResult1 Validate(Company model);
}

同样,我还需要检查公司的财务账户、税收、审计等:

public interface IValidateCompanyAccounts : IValidate<ValidationResult2, Company>
{
  ValidationResult2 Validate(Company model);
  bool HasAuditPassed(Company model);
}

响应。 class处理两种 IValidate 接口

public class ValidateCompanyPolicies : IValidateCompanyPolicies
{
    ValidationResult1 Validate(Company model)
    {
        // Hit stored procedure corresponding to company policies validation
    }
}

public class ValidateCompanyAccounts : IValidateCompanyAccounts
{
    ValidationResult2 Validate(Company model)
    {
        // Hit stored procedure corresponding to company's monetary accounts validation
    }

    bool HasAuditPassed(Company model)
    {
        // Hit stored procedure corresponding to get company audit results
    }
}

我的端class在执行验证后需要执行所有业务密集型操作:

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
            }
        }
    }
}