2017-02-07 93 views
13

Mam tam przypadek, że muszę wykonać zestaw reguł sprawdzania poprawności dla różnych firm. Będzie wiele zasad sprawdzania poprawności przeciwko jednej firmie.Wykonaj zestaw sprawdzania poprawnościRule-C# Projektowanie klasy - lepsze podejście

Więc mam następującą strukturę tabeli

Spółka

 
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 

Mam oddzielne procedury składowane dla każdej reguły sprawdzania poprawności.

Więc z mojego kodu C# znajdę całą regułę sprawdzania poprawności odpowiadającą firmie i potrzebuję wykonać procedurę przechowywaną sprawdzania poprawności powiązaną z tą regułą.

Tak więc planuję zachować jeden interfejs "IValidation", który ma różne metody sprawdzania poprawności.

Albo

Czy muszę tworzyć różne zajęcia dla każdego walidacji który implementuje interfejs

Może ktoś proszę sugerują lepsze podejście w tej sprawie.

+0

wybaczyć moją ignorancję, ale co dokładnie jest SP? – CKing

+0

@CKing Stored Procedure –

+0

Więc dla każdej reguły musisz wykonać procedurę przechowywaną? – ATC

Odpowiedz

1

Twój pierwszy poziom rodzajowego interfejsu walidacji co daje elastyczność zapewniając zarówno typ wynik i model, aby zostać potwierdzone:

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

Powiedzmy, muszę zweryfikować politykę spółki, która będzie odbywać się przez inny sp sumie:

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

Znowu też trzeba sprawdzić rachunków pieniężnych firmy, podatki, kontrole itp:

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

Resp.Klasy obchodzenia się oba rodzaje interfejsu 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 
    } 
} 

moja klasa końcowy, który potrzebuje do wykonywania wszystkich operacji biznesowych intensywne po przeprowadzeniu walidacji

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.Dziękuję bardzo za odpowiedź szczegółową .. spróbuję tego – vmb

0

Istnieje kilka scenariuszy:

  • Jeśli wszystkie Valudation SP mają takie same parametry i wyniki, można utworzyć jedną klasę, aby wywołać wszystkie SPS i po prostu przechowywać nazwy SP w CompanyValidationRuleMapping stół. Zobacz Called SP from another SP

  • Jeśli każdy SP jest bardzo różny, to musiałby inną klasę dla każdego SP

Polecam tworzenie wszystkie SP z tymi samymi parametrami i wyniku, ponieważ takie podejście byłoby łatwiej się rozwijać i zmieniać.

+0

Parametry będą takie same. Ale zwraca różne wyniki – vmb

+0

Oddzielna klasa dla każdej reguły implementującej IValidację będzie lepsza, sposób sprawdzania poprawności może się zmienić (na razie używasz SP, to samo może się zmienić), a osoba wywołująca klasę IValidation po prostu niepokoi się tym, co powraca podstawowa metoda IValidacji, która sama będzie zawierała wszystkie szczegóły dotyczące wyniku Walidacji. – madan

+0

Tylko pamiętaj o zasobach firmy, niedawno pracowałem w miejscu, które używało wielu reguł i gdzie większość facetów, którzy dużo pracowali, było naprawdę dobrych w SQL, a nie w C#, więc w takim przypadku mając więcej SP niż Klasa C# byłaby lepsza. – TheBigSot