执行一组 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
}
}
}
}
我有一个案例需要为不同的公司执行一组验证规则。将有针对一个公司的多个验证规则。
所以我有以下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
}
}
}
}