Dubravko's Blog

Dok dišem nadam se…

Š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% [?]

Posted by dkukec On November - 26 - 2008 Microsoft Enterprise Library

Leave a Reply



Subscribe here

TAG CLOUD