Domain Model, Binding e DTO

Quando sviluppiamo applicazioni usando metodologie DDD e quindi creando un domain model capita spesso di avere la necessita di aggiungere proprietà composte che hanno lo scopo di appiattire il grafo degli oggetti per semplificare il binding dei dati sull'interfaccia utente.

Per capire meglio il contesto consideriamo il seguente esempio dell'oggetto Employee:

public class Employee
{
    private String _name;
    private Address _address;

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
    public Address Address
    {
        get { return _address; }
        set { _address = value; }
    }
}
public class Address
{
    private String _street;
    private String _city;

    public string Street
    {
        get { return _street; }
        set { _street = value; }
    }
    public string City
    {
        get { return _city; }
        set { _city = value; }
    }
}

Supponiamo che ci venga richiesto di visualizzare in un elenco (un GridView) tutti gli Employee con nome e indirizzo completo. Purtroppo ASP.NET non supporta il binding di oggetti annidati (WPF si) quindi non posso "bindare" la proprietà "Address.Street" alla GridView.

La prima soluzione che ci viene in mente è quella di rimappare la proprietà Address dell'oggetto Employee in questo modo:

public classs Employee
{
    // ....
    public String FullAddress
    {
        get { return String.Format("{0}, {1}", Address.Street, Address.City;}
    }
}

Cosi facendo il binding torna ad essere semplice ma il Domain Model viene sporcato con proprietà non tipicamente legate al contesto applicativo e con il passare del tempo, e il crescere del numero di proprietà di supporto al binding, il DM diventa difficile da mantenere e meno rappresentativo della logica di business perchè pieno di "frills" per gestire la visualizzazione dei dati.

 

Come si può risolvere il problema in modo elegante tenendo il DM integro?

Introducendo il concetto di DTO (Data Transfer Object) cioè semplici oggetti che hanno lo scopo di portare le informazioni sull'interfaccia utente.

[continua....]

Print | posted on sabato 20 ottobre 2007 19.12

Comments on this post

# re: Domain Model, Binding e DTO

Requesting Gravatar...
Voglio il seguito ... :-)
Left by raffaeu on ott 21, 2007 11.29

# re: Domain Model, Binding e DTO

Requesting Gravatar...
Ciao Ema,
sicuramente è più "pulito" usare un DTO che "sporcare" il dm.

Creare ad esempio dei controlli custom che supportano il binding annidato ? ad esempio una CustomBuondColumn ?
Left by Roberto Valenti on ott 21, 2007 11.28

# re: Domain Model, Binding e DTO

Requesting Gravatar...
Ciao Roberto.
Si è una possibile alternativa però in questo modo se passi da un'app windows ad una web devi ricrearti il controllo (cosa non sempre facile).
Mi sembra comunque una buona alternativa.
Left by Emanuele DelBono on ott 22, 2007 9.56

# Re: Domain Model, Binding e DTO

Requesting Gravatar...
quello che non mi piace dei DTO e' la T di Transfer, perche' si riferisce a quando il DM o business layer e' remoto..

senza cambiare di una virgola il concetto, a volte uso il termine 'vista' per avere la stessa cosa, una 'rappresentazione' del DM che sia piu' facilmente digeribile dalla UI

ciao!
-papo-
Left by papo on ott 23, 2007 9.53

# Re: Domain Model, Binding e DTO

Requesting Gravatar...
dimenticavo.. ovviamente la 'vista' e' facilmente confondibile con la view del MVC!
quello di trovare un buon glossario di termini e' un problema fondamentale..

ciao
-papo-
Left by papo on ott 23, 2007 9.55

# DTO: una possibile implementazione

Requesting Gravatar...
Nel precedente post abbiamo discusso il problema dell'"inquinamento" del Domain Model dovuto
Left by ema on ott 23, 2007 11.43

Your comment:

 (will show your gravatar)
 
Please add 8 and 6 and type the answer here: