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

时间:2017-02-07 09:01:23

标签: c# .net oop architecture class-design

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

所以我有以下表格结构

公司

ID      CompanyName  
1       ABC   
2       DEF  

ValidationRule

RuleID      Name  
1           Rule1   
2           Rule2 

CompanyValidationRuleMapping

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

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

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

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

或者

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

任何人都可以建议一个更好的方法。

2 个答案:

答案 0 :(得分:1)

您的第一级通用验证界面,可以灵活地提供结果类型和要验证的模型:

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

RESP。处理两种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
    }
}

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

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

答案 1 :(得分:0)

有几种情况:

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

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

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