Ho un servizio WCF e ho appena creato un DTO per un oggetto business.Oggetti di trasferimento dati: eseguire il mapping in DTO o in oggetto business?
La mia domanda è dove mettere la mappatura tra i due?
A) Nel DTO?
public class PersonDTO
{
[DataMember] public string Id { get; set; }
[DataMember] public string Name { get; set; }
public void CloneFrom(Person p)
{
Id = p.Id;
Name = p.Name;
}
public void Populate(Person p)
{
p.Id = Id;
p.Name = Name;
}
}
o
B) Nel oggetto di business?
public class Person
{
public string Id { get; set; }
public string Name { get; set; }
public void CloneFrom(PersonDTO dto)
{
Id = dto.Id;
Name = dto.Name;
}
public PersonDTO GetDTO()
{
return new PersonDTO()
{
Id = Id;
Name = Name;
}
}
}
Mi piace la separazione degli interessi in A (oggetto di business non è a conoscenza di DTOs), ma preferisco l'incapsulamento di B (senza necessità di esporre le budella degli oggetti di business per DTO).
Mi chiedevo solo se ci fosse un modo standard?
Davvero? Se ho intenzione di esporre il mio oggetto business per consentire a una terza classe di eseguire la mappatura, potrei farlo anche nel DTO. Creare un'altra classe mi sembra davvero eccessivo. Darei un'occhiata a automapper, grazie. – GazTheDestroyer
@GazTheDestroyer: un DTO è pensato per il trasferimento di dati e non la trasformazione. Un DTO non deve essere consapevole del suo utilizzo, cioè: mappature. Trasporta i dati e spetta al consumatore utilizzare i dati per qualsiasi scopo, ad esempio: mapparli ad un ViewModel, ad esempio. Siete liberi di aggiungere mappature al DTO, ma a mio modesto parere ciò significa che, sebbene manchi l'uso previsto di un DTO, il DTO non è più un DTO. Nel nostro attuale progetto un repository genera entità. BL riceve le entità, le associa a DTO. Interfaccia utente query BL, ottiene DTO e li mappa a ViewModels (come richiesto). – Nope