Mam usługę WCF i właśnie utworzyłem DTO dla obiektu biznesowego.Obiekty przenoszenia danych - czy mapowanie w DTO, czy w obiekcie biznesowym?
Moje pytanie brzmi: gdzie umieścić mapowanie między tymi dwoma?
A) W 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;
}
}
lub
B) W obiekcie biznesowym?
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;
}
}
}
Lubię oddzielenie obawy w obiekcie (firma ma żadnej wiedzy o DTOs), ale wolę kapsułkowanie B (nie trzeba wystawiać wnętrzności obiektów biznesowych do DTO).
Zastanawiasz się, czy istnieje standardowy sposób?
Naprawdę? Jeśli mam wystawić mój obiekt biznesowy, aby umożliwić mapowanie trzeciej klasy, równie dobrze mógłbym to zrobić w DTO. Stworzenie kolejnej klasy wydaje mi się dość przesadne. Rzucę okiem na automappera, dziękuję. – GazTheDestroyer
@GazTheDestroyer: DTO służy do przesyłania danych, a nie przekształcania. DTO nie powinno być świadome jego użycia, tj .: mapowania. Przenosi dane i od konsumenta zależy, czy wykorzysta dane w jakimkolwiek celu, tj. Na przykład mapuje je na ViewModel. Możesz dodawać odwzorowania do DTO, ale w mojej skromnej opinii oznacza to, że nie wykorzystujesz zamierzonego celu DTO i jako taki, Twój DTO przestaje być DTO. W naszym obecnym projekcie repozytorium generuje encje. BL otrzymuje byty, odwzorowuje je na DTO. Zapytanie o warstwę interfejsu użytkownika BL, pobiera DTO i odwzorowuje je na ViewModels (zgodnie z wymaganiami). – Nope