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:
- Ver modelo : se utiliza para modelar datos para una vista. Por lo general, tiene anotaciones de datos para ayudar al enlace y la validación. En MVVM, también actúa como un controlador. Es más que un DTO
- Objeto de valor : se usa para representar valores
- Raíz Agregada : se usa para administrar estados e invariantes
- Manipuladores : utilizados para responder a un evento / mensaje
- Atributos : se usan como decoraciones para tratar problemas transversales
- Servicio : utilizado para realizar tareas complejas.
- Controlador : se usa para controlar el flujo de solicitudes y respuestas
- Fábrica : se usa para configurar y / o ensamblar objetos complejos para usar cuando un constructor no es lo suficientemente bueno. También se usa para tomar decisiones sobre qué objetos deben crearse en tiempo de ejecución.
- Repositorio / DAO : utilizado para acceder a datos
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:
- Un DTO es un POCO
- Un POCO no es un DTO
- Un modelo de vista es un POCO
- Un POCO no es un modelo de vista
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.