DTO: ultima puntata

Questo post chiude il giro sui DTO (o ViewObjects).

Nello scorso post abbiamo visto una soluzione sufficientemente elegante per implementare dei DTO usando delle classi Wrapper attorno agli oggetti del DM.
Tale soluzione è per quel che ho visto la più utilizzata ma in questo post vorrei mostrare una terza implementazione possibile.
L'unica pecca della soluzione precedente della classe wrapper è che il DTO dipende dall'oggetto del DM in quanto al suo interno ha un riferimento alla classe Employee.
Per svincolarci anche da questo legame possiamo costruire una classe che contiene solo le proprietà da portare sull'interfaccia senza però dipendere dal DM. Ad esempio:

    public class EmployeeDTO 
    {
        private String _name;
        private String _fullAddress;
        
        public String Name
        {
            get { return _name; }
            set { _name = value; }
        }
    
        public String FullAddress
        {
            get { return _fullAddress; }
            set { _name = _fullAddress; }
        }
    }

Naturalmente in questo modo sorge un altro problema. Chi ha il compito di riempire questa classe? Sarà il service layer ad occuparsi del mapping di oggetti del DM con oggetti DTO e viceversa.
Quindi questa soluzione, benchè più indipendende, crea un'altra dipendenza, seppur di minore impatto, nel service layer, inoltre, ha la scomodità di doversi scrivere una serie di metodi di conversione DM->DTO e DTO->DM.

Marco in un suo  post ha ripreso l'argomento dal punto di vista dei servizi e questo post in qualche modo si riaggancia al suo e risponde anche ad un suo commento al post precedente.


Print | posted on giovedì 1 novembre 2007 10.44

Comments on this post

# re: DTO: ultima puntata

Requesting Gravatar...
IMHO non mi piace perchè in primis fulladdress non deve essere cosi' accessibile, e poi cosa facciamo replichiamo le entities con il DTO? Certo che no.
Left by raffaeu on nov 01, 2007 10.59

# re: DTO: ultima puntata

Requesting Gravatar...
Sul discorso accessibilità dipende dall'uso che ne devi fare: se FullAddress deve essere letta e scritta tramite una textbox imho non hai molte alternative.
Occhio però che un DTO non replica le entity, per ogni DTO esistono più entity. Approssimando possiamo dire che esiste un DTO per ogni Aggregato.
Left by Emanuele DelBono on nov 01, 2007 11.15

# re: DTO: ultima puntata

Requesting Gravatar...
Scusa eh, saro' certamente io che non capisco, ma perché non fare una cosa di questo genere(Pascal pseudo-code ma dovrebbe essere comprensibile):

Type
IDTOMap = interface
PropertyCount : Integer;
Properties[ Index : Integer ] : System.Object;
PropertyByName[ Index : String ] : System.Object;
end;

TDTOMapBase = class( System.Object, IDTOMap )
function GetPropertyCount : Integer;
function GetPropertyValue( Index : Integer ) : System.Object;
procedure SetPropertyValue( Index : Integer; Value : System.Object );
// Stessa cosa per il ByName
end;

Dopo di che, tutte le tue classi DTO le erediti da lì ed esponi solo l'interfaccia.

Fare una cosa del genere con dotNET mi sembra tutt'altro che fantascienza...

Andrea
Left by Andrea Raimondi on nov 01, 2007 12.16

# re: DTO: ultima puntata

Requesting Gravatar...
Ah e già che ci sei, se proprio vuoi fare il figo, puoi anche farti un mapping xml tra classi, in questo modo puoi anche farti le classi come preferisci.

Infine, terza alternativa, puoi spostare l'interfaccia IDTOMap sul tuo domain model ed
utilizzare il passaggio inverso, così tutto ciò che vedi lato service layer è una interfaccia e null'altro. Non sono un esperto di dotNET, quindi non so se sia possibile anche questa quarta alternativa, vale a dire fare la IDTOMap come marker interface ed implementare un semplice metodo che ritorna una interfaccia generica che però - a sua volta - è di un tipo compatibile IDTOMap. Tramite il metodo scopri che interfaccia è e fai il cast a run-time per maneggiarla, sono idee così ma potresti trarne qualche buono spunto.

Ciao,

Andrea
Left by Andrea Raimondi on nov 01, 2007 12.21

# re: DTO: ultima puntata

Requesting Gravatar...
x Andrea
La soluzione sicuramente ti permette di risparmiare un bel po' di codice ma accedere alle proprietà utilizzando un indice o una stringa non è molto comodo perchè non sfrutti il compilatore per trovare gli errori.
Comunque sicuramente esiste un modo per ridurre il codice da scrivere, ma il post voleva illustrare una possibilità che può essere sicuramente ottimizzata durante l'implementazione.
Left by Emanuele DelBono on nov 01, 2007 12.23

# re: DTO: ultima puntata

Requesting Gravatar...
x Andrea: imho però qui stiamo facendo un po' di over-engineering e forse YAGNI.
Io sono sempre per le soluzioni più semplici e veloci in prima battuta, poi eventualmente se vedo qualche smell faccio refactoring.
Left by Emanuele DelBono on nov 01, 2007 12.26

Your comment:

 (will show your gravatar)
 
Please add 2 and 5 and type the answer here: