2017-02-07 30 views
13

我有一个案例,我需要为不同的公司执行一组验证规则。针对一家公司将有多个验证规则。执行Set ValidationRule-C#类设计 - 更好的方法

所以我下面的表格结构

公司

 
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”,它有不同的验证方法。

或者

我可以为它实现一个接口

任何人都可以请建议在这更好的方法每个验证创建不同的类。

+0

请原谅我的无知,但究竟什么是SP? – CKing

+0

@Cing存储过程 –

+0

因此,对于每个规则,您必须执行一个存储过程? – ATC

回答

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

比方说,我需要验证这将通过不同的处理公司政策用上干脆:

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

@ RRM ..谢谢你这么多的详细的答案..我会试试这个 – vmb

0

有几种情况:

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

  • 如果每个SP是非常不同的,那么你就需要一个不同的类为每个SP

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

+0

参数将是相同的。但它为每个规则实施IValidation会更好,验证的运行方式可以改变返回不同的结果 – vmb

+0

单独的类(现在您正在使用SP,这本身就可能会改变)和IValidation类的调用者只需在意英语IValidation回报,这本身将包含所有关于验证的结果,详细的基本方法。 – madan

+0

只是要留意公司的资源,不久前我曾是使用的许多规则和最多的地方是做了很多维护的是在SQL,而不是C#确实不错,所以有超过SP这种情况下,球员C#类会更好。 – TheBigSot