执行验证规则集C#类设计-更好的方法



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

所以我有下面的表格结构

公司

ID公司名称1 ABC2 DEF

验证规则

RuleID名称1规则12规则2

公司验证规则映射

映射ID CompanyId RuleID1 1 12 1 23 2 2

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

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

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

我可以为每个实现接口的验证创建不同的类吗

有人能提出一个更好的方法吗。

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

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

有几个场景:

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

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

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

最新更新