2012-04-24 7 views
6

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?

Odpowiedz

11

Uważam, że to wymaga oddzielnej klasy, ponieważ ani BO, ani DTO nie powinny zajmować się przekształcaniem w inną klasę.

Osobiście używam biblioteki automapper do transformacji obiektów. Dzięki prostym przekształceniom, jak w twoim przykładzie, mapowanie odbywa się w jednym wierszu kodu, skomplikowane transformacje są również łatwe do skonfigurowania.

Jeśli chcesz utworzyć mapę, możesz nadal korzystać z metod rozszerzania, aby zachować implementację odwzorowania oddzieloną od klas DTO i BO.

+0

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

+4

@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

1

Proponuję warstwę składnika. Powinien być odpowiedzialny za komunikację między warstwą biznesową a warstwą danych. W takim przypadku można go użyć do przetłumaczenia obiektów DTO na obiekty biznesowe.

+0

Z mojego doświadczenia wynika, że ​​chociaż NetTiers ma kilka dobrych cech, to jednak praca z nim może być frustrująca, zobacz http://stackoverflow.com/questions/8220206/whither-nettiers –

+0

@DavidClarke Odwołanie, które miałem głównie dotyczyło definicji warstwa składowa. Podany link jest uszkodzony, więc usunę. :) – Khan

0

Nie martw się "nie trzeba ujawniać odwagi obiektu biznesowego do DTO" wydaje się nieco bezpodstawny, chyba że jest coś, czego nie pokazuje się w tobie kodu, ponieważ masz dostęp do właściwości publicznych, tj. W ogóle nie odwagi.

Tak na marginesie, zamiast metod klonów można zaimplementować operator rzucania Zamiast: MSDN

W ten sposób można zrobić coś takiego: Person p = (osoba) myPersonDTO;

+0

Tak, mój przykład był bardzo prosty. W rzeczywistości moje obiekty biznesowe mają prywatne rzeczy, których nie chcę ujawniać do celów mapowania. – GazTheDestroyer

+1

Jeśli rzeczy w BO są zdefiniowane jako prywatne/chronione, to nic, co z nich korzysta, nie będzie tego widzieć, więc nie wiesz, jaki jest problem na tym froncie. – Peter

Powiązane problemy