Što je s nasljeđivanjem i mogućnostima validacije? Uzmimo za primjer adresu, svaka adresa ima ulicu, kućni broj, grad, … No, ako uzmemo razlike između adrese tvrtke i adrese pojedinca (npr. kupca), vidimo da adresa tvrtke ima CompanyName, dok pojedinac ima ime i prezime (FirstName, LastName).Te razlike naravno „ulaze“ u provjeru, dakle u prvom slučaju adresa je ispravna ako je upisan i CompanyName, a u drugom slučaju ako su upisani podaci za ime i prezime.
Postoji nekoliko rješenja kako ugraditi pravila pomoću Validation Application Block-a. Jedno od tih rješenja je sa nasljeđivanjem. Dakle, napravimo klasu Address koja ima zajedničke elemente, te nasljedimo tu klasu u svim vrstama adresa i dodamo specifičnosti za taj slučaj. Slijedeći primjer to pokazuje:
public class Address
{
[StringLengthValidator(20, 100, MessageTemplate = "Address.Street")]
public string Street
{
get { return street; }
set { street = value; }
}
private string street;
public string StreetNo
{
get { return streetNo; }
set { streetNo = value; }
}
private string streetNo;
[StringLengthValidator(20, 200, MessageTemplate = "Address.City")]
public string City
{
get { return city; }
set { city = value; }
}
private string city;
}
public class CompanyAddress : Address
{
[StringLengthValidator(20, 100, MessageTemplate = "CompanyAddress.CompanyName")]
public string CompanyName
{
get { return companyName; }
set { companyName = value; }
}
private string companyName;
}
public class CustomerAddress : Address
{
[StringLengthValidator(20, 100, MessageTemplate = "CustomerAddress.FirstName")]
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
private string firstName;
[StringLengthValidator(20, 100, MessageTemplate = "CustomerAddress.LastName")]
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
private string lastName;
}
Ako kreiramo objekt Company, koristimo adresu CompanyAddress, dok kreiranja Customer-a koristimo CustomerAddress, na tim objektima stavljamo ObjectValidator i stvar funkcionira. Svako pravilo bazne klase (Address) vrijedi i za inheritiranu klasu (CustomerAddress).
A što ako se ponovno javi neka specifičnost, npr. ako neko pravilo iz bazne klase vrijedi u svim ostalim klasama, osim u jednom slučaju? „Nič lažjega kod to…“ (nadam se da sam dobro napisao…) Možemo napraviti override pravila iz bazne klase. Kako? Slijedeći primjer to pokazuje (npr. u CustomerAddress promjenimo pravilo za ulicu):
[StringLengthValidator(20, 200, MessageTemplate = "CustomerAddress.Street")]
public new string Street
{
get { return base.Street; }
set { base.Street = value; }
}
Naravno, mogu se upotrijebiti i Ruleset-ovi i pomoću njih definirati različita pravila u različitim situacijama. Primjer:
public class Address
{
[StringLengthValidator(20, 100, MessageTemplate = "Address.Street", Ruleset = "Company")]
[StringLengthValidator(20, 200, MessageTemplate = "Address.Street", Ruleset = "Customer")]
public string Street
{
get { return street; }
set { street = value; }
}
private string street;
[StringLengthValidator(2, 20, MessageTemplate = " Address.StreetNo")]
public string StreetNo
{
get { return streetNo; }
set { streetNo = value; }
}
private string streetNo;
[StringLengthValidator(20, 100, MessageTemplate = " Address.City", Ruleset = "Company")]
[StringLengthValidator(20, 200, MessageTemplate = " Address.City", Ruleset = "Customer")]
public string City
{
get { return city; }
set { city = value; }
}
private string city;
}
public class Customer
{
//...
[ObjectValidator(Ruleset = "CustomerRuleSet")] //Validirati i StrretNo
[ObjectValidator("Customer", Ruleset = "CustomerRuleSet")]
public Address Address
{
get { return address; }
set { address = value; }
}
private Address address;
//...
}
public class Company
{
//...
[ObjectValidator("Company", Ruleset = "CompanyRuleSet")]
public Address Address
{
get { return address; }
set { address = value; }
}
private Address address;
//...
}
Mogućnosti ima puno, sve ovisi o konkretnim potrebama i preferiranim stilovima pisanja koda. No, ako postoje neka pravila koja ovi slučajevi nemogu pokriti, uvijek postoji mogućnost pisanja kompleksnih pravila pomoću SelfValidation metoda.
Popularity: 5% [?]