Plain Old CLR Object vs Data Transfer Object

POCO = Plain Old CLR (or better: Class) Object

DTO = Data Transfer Object

W tym poście jest różnica, ale szczerze mówiąc większość blogów, które czytam, opisuje POCO w sposób, w jaki Dto jest zdefiniowane: DTOs to proste kontenery danych używane do przenoszenia danych między warstwami aplikacji.

Czy POCO i DTO to to samo?

Author: Bhargav Rao, 2009-04-07

9 answers

A POCO przestrzega zasad OOP. Powinien (ale nie musi) mieć stan i zachowanie. Poco pochodzi z POJO, ukuty przez Martina Fowlera [] anegdota tutaj]. Użył terminu POJO jako sposobu na bardziej seksowne odrzucenie implementacji Framework heavy EJB. POCO powinno być używane w tym samym kontekście w .Net. nie pozwól, aby frameworki dyktowały projekt Twojego obiektu.

Jedynym celem DTO jest przeniesienie stanu i nie powinno mieć żadnego zachowania. # Patrz Martin Fowler Wyjaśnienie DTO dla przykładu użycia tego wzoru.

Oto różnica: POCO opisuje podejście do programowania (good old fashioned object oriented programming), gdzie DTO jest wzorcem , który jest używany do "przesyłania danych" za pomocą obiektów.

Chociaż możesz traktować POCOs jak DTOs, ryzykujesz stworzenie anemicznego modelu domeny, jeśli to zrobisz. Dodatkowo istnieje niedopasowanie w strukturze, ponieważ DTOs powinno być zaprojektowane do przesyłania danych, a nie do reprezentowania prawdziwej struktury domeny biznesowej. Rezultatem tego jest to, że DTOs wydają się być bardziej płaskie niż faktyczna domena.

W domenie o dowolnej złożoności, prawie zawsze lepiej jest utworzyć osobne POCOs domeny i przetłumaczyć je na DTOs. DDD (domain driven design) definiuje warstwę antykorupcyjną (inny link tutaj , ale najlepszą rzeczą do zrobienia jest Kup książkę ), która jest dobrą strukturą, która sprawia, że segregacja czysta.

 532
Author: Michael Meadows,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-28 13:25:46

To chyba zbędne dla mnie, aby przyczynić się, ponieważ już podałem swoje stanowisko w moim artykule na blogu, ale ostatni akapit tego artykułu trochę podsumowuje rzeczy:

podsumowując, naucz się kochać POCO i upewnij się, że nie rozpowszechniasz żadnych dezinformacji o tym, że jest to to samo, co DTO. Dto to proste kontenery danych używane do przenoszenia danych między warstwami aplikacji. POCOs są pełnoprawnymi obiektami biznesowymi z jednym warunkiem, że są Uporczywość (brak metod get lub save). Na koniec, jeśli nie sprawdziłeś jeszcze Książki Jimmy ' ego Nilssona, odbierz ją z lokalnych stosów uniwersyteckich. Ma przykłady w C# i świetnie się czyta.

BTW, Patryk przeczytałem POCO jako artykuł lifestylowy i całkowicie się Zgadzam, że to fantastyczny artykuł. To właściwie fragment książki Jimmy ' ego Nilssona, którą poleciłem. Nie miałem pojęcia, że jest on dostępny online. Jego książka jest naprawdę najlepszym źródłem informacji znalezione na POCO / Dto / Repository / i innych praktykach programistycznych DDD.

 45
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-09 02:32:51

POCO jest po prostu obiektem, który nie przyjmuje zależności od zewnętrznego frameworka. Jest prosta.

To, czy POCO ma zachowanie, czy nie, jest nieistotne.

A DTO może POCO jak może obiekt domeny (który zazwyczaj byłby bogaty w zachowanie)

Zazwyczaj Dto częściej przyjmują zależności od zewnętrznych frameworków (np. atrybutów) do celów serializacji, ponieważ zazwyczaj wychodzą na granicy systemu.

W typowych architekturach typu cebula (często używane w szeroko pojętym podejściu DDD) warstwa domeny jest umieszczona w środku, a więc jej obiekty nie powinny w tym momencie mieć zależności poza tą warstwą.

 25
Author: Neil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-25 13:08:23

Napisałem artykuł na ten temat: Dto vs Value Object vs POCO .

W skrócie:

    DTO != Value Object
  • DTO ⊂ POCO
  • obiekt wartości ⊂ POCO
 9
Author: Vladimir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-13 17:55:29

Myślę, że DTO może być POCO. DTO jest bardziej o wykorzystaniu obiektu, podczas gdy POCO jest bardziej styl obiektu (oddzielony od koncepcji architektonicznych).

Jednym z przykładów, gdzie POCO jest czymś innym niż DTO jest, gdy mówisz o POCO w swoim modelu domeny / modelu logiki biznesowej,który jest ładną reprezentacją oo Twojej domeny problemowej. Możesz użyć POCO w całej aplikacji, ale może to mieć jakiś niepożądany efekt uboczny taka wiedza przecieki. DTO są na przykład używane z warstwy usług, z którą komunikuje się interfejs użytkownika, DTO są płaską reprezentacją danych i są używane tylko do dostarczania danych interfejsu użytkownika i przekazywania zmian z powrotem do warstwy usługowej. Warstwa usług jest odpowiedzialna za mapowanie DTO w obie strony do obiektów domeny poco.

Update Martin Fowler powiedział, że takie podejście jest ciężką drogą do podjęcia i powinno być podjęte tylko wtedy, gdy istnieje znaczące niedopasowanie pomiędzy warstwą domeny a interfejsem użytkownika.

 6
Author: Davy Landman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-07 12:29:26

Oto ogólna zasada: DTO= = zło i wskaźnik nadprogramowego oprogramowania. POCO = = dobrze. wzorce 'enterprise' zniszczyły mózgi wielu ludzi w świecie Java EE. proszę nie powtarzać błędu w Krainie. NET.

 2
Author: benmmurphy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-10 17:52:55

Podstawowym przypadkiem użycia DTO jest zwracanie danych z usługi internetowej. W tym przypadku poco i DTO są równoważne. Każde zachowanie w POCO zostanie usunięte, gdy zostanie zwrócone z usługi internetowej, więc tak naprawdę nie ma znaczenia, czy ma zachowanie.

 0
Author: John Saunders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-07 12:41:58

Klasy DTO są używane do serializacji/deserializacji danych z różnych źródeł. Jeśli chcesz deserializować obiekt ze źródła, nie ma znaczenia, jakie to jest Zewnętrzne źródło: usługa, plik, baza danych itp. być może chcesz użyć tylko pewnej części, ale chcesz łatwego sposobu deserializacji tych danych do obiektu. następnie skopiujesz te dane do Xmodelu, którego chcesz użyć. Serializer to piękna technologia do ładowania obiektów DTO. Dlaczego? wystarczy tylko jedna funkcja, aby załadować (deserializować) obiekt.

 0
Author: Herman Van Der Blom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-27 14:13:12

Nawet nie nazywaj ich DTOs. Nazywane są modelami ....Kropka. Modele nigdy nie mają zachowania. Nie wiem, kto wymyślił ten głupi termin DTO, ale to musi być rzecz. NET, to wszystko, co mogę wymyślić. Pomyśl o modelach widoku w MVC, ta sama rzecz**, modele są używane do przesyłania stanu między warstwami po stronie serwera lub przez okres drutu, wszystkie są modelami. Właściwości z danymi. To są modele, które przekazujesz ove drutu. Modelki, Modelki Modelki. To wszystko.

I wish the stupid term DTO odejdzie od naszego słownictwa.

 -14
Author: PositiveGuy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-05 06:07:23