2017-02-07 38 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