POCO = Objeto CLR antiguo simple (o mejor: clase)
DTO = Objeto de transferencia de datos
En esta publicación hay una diferencia, pero, francamente, la mayoría de los blogs que leo describen POCO en la forma en que se define el DTO: los DTO son contenedores de datos simples que se utilizan para mover datos entre las capas de una aplicación.
¿Son POCO y DTO lo mismo?
Respuestas:
Un POCO sigue las reglas de OOP. Debe (pero no tiene que) tener estado y comportamiento. POCO proviene de POJO, acuñado por Martin Fowler [ anécdota aquí ]. Utilizó el término POJO como una forma de hacer que sea más sexy rechazar las implementaciones pesadas de EJB del marco. POCO debe usarse en el mismo contexto en .Net. No permita que los marcos dicten el diseño de su objeto.
El único propósito de un DTO es transferir el estado y no debe tener ningún comportamiento. Vea la explicación de Martin Fowler de un DTO para un ejemplo del uso de este patrón.
Aquí está la diferencia: POCO describe un enfoque de programación (buena programación orientada a objetos a la antigua), donde DTO es un patrón que se usa para "transferir datos" usando objetos.
Si bien puede tratar a los POCO como DTO, corre el riesgo de crear un modelo de dominio anémico si lo hace. Además, hay una falta de coincidencia en la estructura, ya que los DTO deben diseñarse para transferir datos, no para representar la verdadera estructura del dominio empresarial. El resultado de esto es que los DTO tienden a ser más planos que su dominio real.
En un dominio de cualquier complejidad razonable, casi siempre es mejor crear POCO de dominio separados y traducirlos a DTO. DDD (diseño impulsado por dominio) define la capa anticorrupción (otro enlace aquí , pero lo mejor que puede hacer es comprar el libro ), que es una buena estructura que aclara la segregación.
fuente
Probablemente sea redundante para mí contribuir, ya que dije mi posición en el artículo de mi blog, pero el párrafo final de ese artículo resume las cosas:
Entonces, en conclusión, aprenda a amar al POCO y asegúrese de no difundir ninguna información errónea sobre si es lo mismo que un DTO. Los DTO son contenedores de datos simples que se utilizan para mover datos entre las capas de una aplicación. Los POCO son objetos comerciales completos con el único requisito de que sean ignorantes de persistencia (sin métodos de obtención o guardado). Por último, si aún no ha revisado el libro de Jimmy Nilsson, recójalo en las pilas de su universidad local. Tiene ejemplos en C # y es una gran lectura.
Por cierto, Patrick, leí el POCO como un artículo de estilo de vida, y estoy completamente de acuerdo, es un artículo fantástico. En realidad es una sección del libro de Jimmy Nilsson que recomendé. No tenía idea de que estaba disponible en línea. Su libro es realmente la mejor fuente de información que he encontrado sobre POCO / DTO / Repository / y otras prácticas de desarrollo DDD.
fuente
POCO es simplemente un objeto que no depende de un marco externo. Es llano.
Si un POCO tiene comportamiento o no, es irrelevante.
Un DTO puede ser POCO al igual que un objeto de dominio (que normalmente sería rico en comportamiento).
Por lo general, es más probable que los DTO tomen dependencias de marcos externos (p. Ej., Atributos) con fines de serialización, ya que generalmente salen del límite de un sistema.
En las arquitecturas típicas de estilo Onion (a menudo utilizadas dentro de un enfoque ampliamente DDD), la capa de dominio se coloca en el centro y, por lo tanto, sus objetos no deberían tener dependencias fuera de esa capa.
fuente
Escribí un artículo para ese tema: DTO vs Value Object vs POCO .
En breve:
fuente
Creo que un DTO puede ser un POCO. DTO es más sobre el uso del objeto, mientras que POCO es más sobre el estilo del objeto (desacoplado de los conceptos arquitectónicos).
Un ejemplo en el que un POCO es algo diferente al DTO es cuando habla de los POCO dentro de su modelo de dominio / modelo de lógica de negocios, que es una buena representación OO de su dominio problemático. Podría usar los POCO en toda la aplicación, pero esto podría tener algunos efectos secundarios indeseables, tales filtraciones de conocimiento. Los DTO se utilizan, por ejemplo, desde la capa de servicio con la que se comunica la IU, los DTO son una representación plana de los datos, y solo se utilizan para proporcionar datos a la IU y comunicar los cambios a la capa de servicio. La capa de servicio se encarga de asignar las dos formas del DTO a los objetos de dominio POCO.
Actualización Martin Fowler dijo que este enfoque es un camino difícil de tomar, y solo debe tomarse si hay una falta de coincidencia significativa entre la capa de dominio y la interfaz de usuario.
fuente
Un caso de uso primario para un DTO es devolver datos de un servicio web. En este caso, POCO y DTO son equivalentes. Cualquier comportamiento en el POCO se eliminará cuando se devuelva desde un servicio web, por lo que realmente no importa si tiene o no comportamiento.
fuente
Aquí está la regla general: DTO == mal e indicador de software sobre-diseñado. POCO == bueno. Los patrones de 'empresa' han destruido los cerebros de muchas personas en el mundo Java EE. por favor no repita el error en .NET land.
fuente
Las clases DTO se utilizan para serializar / deserializar datos de diferentes fuentes. Cuando desee deserializar un objeto de una fuente, no importa de qué fuente externa se trate: servicio, archivo, base de datos, etc. Es posible que solo desee utilizar alguna parte de eso, pero desea una manera fácil de deserializar esos datos a un objeto. después de eso, copie esos datos en el XModel que desea usar. Un serializador es una hermosa tecnología para cargar objetos DTO. ¿Por qué? solo necesita una función para cargar (deserializar) el objeto.
fuente
TL; DR:
Un DTO describe el patrón de transferencia de estado. Un POCO no describe nada. Es otra forma de decir "objeto" en OOP. Proviene de POJO (Java), acuñado por Martin Fowler, quien literalmente lo describe como un nombre más elegante para 'objeto' porque 'objeto' no es muy sexy.
Un DTO es un patrón de objeto utilizado para transferir el estado entre capas de interés. Pueden tener un comportamiento (es decir, técnicamente puede ser un poco) siempre que ese comportamiento no mute el estado. Por ejemplo, puede tener un método que se serialice a sí mismo.
Un POCO es un objeto simple, pero lo que se entiende por 'simple' es que no es especial. Simplemente significa que es un objeto CLR sin patrón implícito. Un término genérico No está hecho para trabajar con algún otro marco. Entonces, si tu POCO tiene
[JsonProperty]
o decoraciones EF en todas sus propiedades, por ejemplo, entonces diría que no es un POCO.Aquí hay algunos ejemplos de diferentes tipos de patrones de objetos para comparar:
Todos estos son solo objetos, pero tenga en cuenta que la mayoría de ellos generalmente están vinculados a un patrón. Entonces podría llamarlos "objetos" o podría ser más específico sobre su intención y llamarlo por lo que es. Por eso también tenemos patrones de diseño; para describir conceptos complejos en algunas obras. DTO es un patrón. La raíz agregada es un patrón, Ver modelo es un patrón (por ejemplo, MVC y MVVM). POCO no es un patrón.
Un POCO no describe un patrón. Es solo una forma diferente de referirse a clases / objetos en OOP. Piense en ello como un concepto abstracto; Pueden referirse a cualquier cosa. En mi opinión, hay una relación unidireccional porque una vez que un objeto alcanza el punto donde solo puede cumplir un propósito de manera limpia, ya no es un POCO. Por ejemplo, una vez que marca su clase con decoraciones para que funcione con algún marco, ya no es un POCO. Por lo tanto:
El punto de hacer una distinción entre los dos es mantener patrones claros y consistentes en un esfuerzo por no cruzar preocupaciones y conducir a un acoplamiento estrecho. Por ejemplo, si tiene un objeto comercial que tiene métodos para mutar el estado, pero también está decorado al infierno con decoraciones EF para guardar en SQL Server Y JsonProperty para que pueda enviarse de regreso a través de un punto final API. Ese objeto sería intolerante a los cambios y probablemente estaría lleno de variantes de propiedades (por ejemplo, UserId, UserPk, UserKey, UserGuid, donde algunos de ellos están marcados para no guardarse en la base de datos y otros marcados para no ser serializados en JSON en el punto final de la API).
Entonces, si me dijeras que algo es un DTO, entonces probablemente me aseguraría de que nunca se usara para otra cosa que no sea mover el estado. Si me dijiste que algo era un modelo de vista, entonces probablemente me aseguraría de que no se guardara en una base de datos. Si me dijiste que algo era un Modelo de dominio, entonces probablemente me aseguraría de que no tuviera dependencias de nada fuera del dominio. Pero si me dijeras que algo es un POCO, realmente no me estarías diciendo mucho.
fuente
Ni siquiera los llames DTO. Se llaman Modelos ... Punto. Las modelos nunca tienen comportamiento. No sé quién se le ocurrió este término tonto DTO, pero debe ser una cosa .NET es todo lo que puedo imaginar. Piense en ver modelos en MVC, lo mismo, los modelos se usan para transferir el estado entre las capas del lado del servidor o durante el período de conexión, todos son modelos. Propiedades con datos. Estos son modelos que pasas por encima del cable. Modelos, Modelos Modelos. Eso es.
Desearía que el estúpido término DTO desapareciera de nuestro vocabulario.
fuente