c# - ValidationRule 的执行集-C# 类设计 - 更好的方法

标签 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             2
3              2             2

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

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

所以我打算保留一个具有不同验证方法的接口(interface)“IValidation”。

或者

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

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

最佳答案

您的第一级通用验证接口(interface)可以灵活地提供结果类型和要验证的模型:

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

响应。处理两种 IValidate 接口(interface)的类

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

关于c# - ValidationRule 的执行集-C# 类设计 - 更好的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42085562/

相关文章:

c# - WPF 中的横向-纵向方向

java - 从 XML 文件读取 Java 中的 RSAPublicKey

.net - 如何将自定义默认生成操作关联到 Visual Studio 中的自定义文件类型?

c++ - 在 C++ 中为游戏对象设计类层次结构

python - 在Python中访问类中的类成员的最佳方法

Python __str__ - 它可以有歧义吗?

c# - 相当于 OS X 上的 user32.dll

c# - 如何让任务等待相同的结果?

c# - 无法在 Win XP 机器上运行 netsh 命令

c# - 如何使用仅替换 www 的第一次出现