TL; DR:
Um DTO descreve o padrão de transferência de estado. Um POCO não descreve nada. É outra maneira de dizer "objeto" no OOP. Ele vem do POJO (Java), cunhado por Martin Fowler, que literalmente o descreve como um nome mais sofisticado para 'objeto' porque 'objeto' não é muito sexy.
Um DTO é um padrão de objeto usado para transferir o estado entre as camadas de preocupação. Eles podem ter comportamento (ou seja, tecnicamente, pode ser um poco), desde que esse comportamento não mude o estado. Por exemplo, ele pode ter um método que se serializa.
Um POCO é um objeto simples, mas o que se entende por "simples" é que ele não é especial. Apenas significa que é um objeto CLR sem padrão implícito. Um termo genérico. Não foi feito para funcionar com outra estrutura. Portanto, se o seu POCO tiver[JsonProperty]
decorações EF em todas as suas propriedades, por exemplo, eu diria que não é um POCO.
Aqui estão alguns exemplos de diferentes tipos de padrões de objetos para comparar:
- Ver modelo : usado para modelar dados para uma vista. Geralmente possui anotações de dados para ajudar na ligação e validação. No MVVM, ele também atua como um controlador. É mais que um DTO
- Objeto Valor : usado para representar valores
- Raiz Agregada : usada para gerenciar estado e invariantes
- Manipuladores : usados para responder a um evento / mensagem
- Atributos : usados como decoração para lidar com preocupações transversais
- Serviço : usado para executar tarefas complexas
- Controlador : usado para controlar o fluxo de solicitações e respostas
- Fábrica : usado para configurar e / ou montar objetos complexos para uso quando um construtor não é bom o suficiente. Também usado para tomar decisões sobre quais objetos precisam ser criados em tempo de execução.
- Repositório / DAO : usado para acessar dados
Estes são apenas objetos, mas observe que a maioria deles geralmente está vinculada a um padrão. Então você pode chamá-los de "objetos" ou pode ser mais específico sobre sua intenção e chamá-lo pelo que é. É também por isso que temos padrões de design; descrever conceitos complexos em alguns trabalhos. DTO é um padrão. A raiz agregada é um padrão, o View Model é um padrão (por exemplo, MVC e MVVM). POCO não é um padrão.
Um POCO não descreve um padrão. É apenas uma maneira diferente de se referir a classes / objetos no OOP. Pense nisso como um conceito abstrato; eles podem estar se referindo a qualquer coisa. Na IMO, existe um relacionamento unidirecional, porque, uma vez que um objeto atinge o ponto em que só pode servir a um propósito de maneira limpa, ele não é mais um POCO. Por exemplo, depois de marcar sua classe com decorações para fazê-la funcionar com alguma estrutura, ela não é mais um POCO. Portanto:
- Um DTO é um POCO
- Um POCO não é um DTO
- Um modelo de exibição é um POCO
- Um POCO não é um modelo de exibição
O objetivo de fazer uma distinção entre os dois é manter padrões claros e consistentes no esforço de não cruzar preocupações e levar a um acoplamento rígido. Por exemplo, se você possui um objeto de negócios que possui métodos para alterar o estado, mas também é decorado com decorações EF para salvar no SQL Server AND JsonProperty, para que possa ser enviado de volta por um ponto de extremidade da API. Esse objeto seria intolerante a alterações e provavelmente estaria repleto de variantes de propriedades (por exemplo, UserId, UserPk, UserKey, UserGuid, onde alguns deles estão marcados para não serem salvos no banco de dados e outros marcados para não serem serializados para JSON no terminal da API).
Então, se você me dissesse que algo era um DTO, provavelmente teria certeza de que nunca foi usado para outra coisa senão mudar o estado. Se você me dissesse que algo era um modelo de exibição, provavelmente teria certeza de que não estava sendo salvo em um banco de dados. Se você me dissesse que algo era um modelo de domínio, provavelmente teria certeza de que não dependesse de nada fora do domínio. Mas se você me dissesse que algo era um POCO, não estaria realmente me dizendo muito.