2017-02-07 3 views
13

다른 회사의 유효성 검사 규칙 집합을 실행할 필요가있는 경우가 있습니다. 한 회사에 대해 여러 개의 유효성 검사 규칙이 있습니다. 내가ValidationRule-C#을 실행하십시오. Class Design - 더 나은 접근법

회사

 
ID  CompanyName 
1  ABC 
2  DEF 

ValidationRule

 
RuleID  Name 
1   Rule1 
2   Rule2 

을 CompanyValidationRuleMapping 테이블 구조 다음 그래서

 
MappingID  CompanyId RuleID 
1    1    1 
2    1    2 
3    2    2 

모든 유효성 검사 규칙에 대해 별도의 저장 프로 시저가 있습니다.

내 C# 코드에서 회사에 해당하는 모든 유효성 검사 규칙을 찾아 해당 규칙과 관련된 유효성 검사 저장 프로 시저를 실행해야합니다.

다른 인증 방법이있는 하나의 인터페이스 'IValidation'을 유지할 계획입니다.

또는

은 내가

는 사람이에 더 나은 방법을 제안 해주십시오 수있는 인터페이스를 구현하는 각 검증을 위해 다른 클래스를 만들 수 있습니다. 몇 가지 시나리오가있다

+0

나의 무지를 용서하지만, 정확히 SP은 무엇인가 : 유효성 검사를 수행 한 후 모든 사업 집약적 인 작업을 수행 할 필요가 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 } } 

내 말 클래스의 두 종류를 처리하는 클래스? – CKing

+0

@CKing 저장 프로 시저 –

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

이의 말을하자, 나는 다른에 의해 처리 될 회사의 정책을 검증 할 필요가 모두 SP :

public interface IValidateCompanyAccounts : IValidate<ValidationResult2, Company> 
{ 
    ValidationResult2 Validate(Company model); 
    bool HasAuditPassed(Company model); 
} 
:

public interface IValidateCompanyPolicies : IValidate<ValidationResult1, Company> 
{ 
    ValidationResult1 Validate(Company model); 
} 

다시 말하지만, 나는 또한 기업 금융 계좌, 세금, 감사 등을 확인해야합니다

Resp.

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 .. 고마워요, 너무 상세한 답변을 통해 UR .. 내가 이것을 시도합니다 – vmb

0

:

  • Valudation SP가 동일한 매개 변수와 결과를 모두, 당신은 모든 SP에 전화를 그냥 CompanyValidationRuleMapping의 SP 이름을 저장하기 위해 하나의 클래스를 생성 할 수있는 경우 표. 모든 SP는 매우 다른 경우이 방법이 될 것이기 때문에 다음,

내가 같은 매개 변수와 결과 모든 SP를 만드는 것이 좋습니다 각 SP에 대해 다른 클래스를 필요, Called SP from another SP

  • 를 참조하십시오 확장 및 변경이 더 쉽습니다. 결과 유형과 모델을 모두 제공하는 유연성을 제공 일반적인 검증 인터페이스의

  • +0

    매개 변수는 동일합니다. 그러나 다른 결과를 반환합니다. – vmb

    +0

    IValidation을 구현하는 각 규칙에 대해 별도의 클래스가 유효하며 유효성 검사 실행 방법이 변경 될 수 있습니다. SP, this 자체가 변경 될 수 있음) IValidation 클래스의 호출자는 IValidation의 기본 메서드가 반환하는 것과 간단히 관련이 있습니다.이 자체는 유효성 검사 결과와 관련된 모든 세부 정보를 포함합니다. – madan

    +0

    그냥 회사 자원에주의를 기울여야 만합니다. 얼마 전 많은 규칙을 사용하는 곳에서 많은 유지 보수 작업을 수행 한 대부분의 사용자가 C#이 아닌 SQL을 사용하여 SQL을 실제로 잘 수행 했으므로 SP보다 C# 클래스가 더 좋을 것입니다. – TheBigSot