TL; DR:
Un DTO descrive il modello di trasferimento dello stato. Un POCO non descrive nulla. È un altro modo di dire "oggetto" in OOP. Viene da POJO (Java), coniato da Martin Fowler che lo descrive letteralmente come un nome più elaborato per "oggetto" perché "oggetto" non è molto sexy.
Un DTO è un modello di oggetto utilizzato per trasferire lo stato tra i livelli di preoccupazione. Possono avere un comportamento (cioè tecnicamente può essere un poco) fintanto che quel comportamento non muta lo stato. Ad esempio, potrebbe avere un metodo che si serializza da solo.
Un POCO è un oggetto semplice, ma ciò che si intende per "semplice" è che non è speciale. Significa solo che è un oggetto CLR senza un modello implicito. Un termine generico. Non è fatto per funzionare con qualche altro framework. Quindi, se il tuo POCO ha [JsonProperty]
o decorazioni EF in tutto le sue proprietà, per esempio, direi che non è un POCO.
Ecco alcuni esempi di diversi tipi di modelli di oggetti da confrontare:
- Visualizza modello : utilizzato per modellare i dati per una vista. Di solito ha annotazioni di dati per aiutare l'associazione e la validazione. In MVVM, funge anche da controller. È più di un DTO
- Valore oggetto : usato per rappresentare valori
- Radice aggregata : utilizzata per gestire lo stato e gli invarianti
- Gestori : utilizzati per rispondere a un evento / messaggio
- Attributi : usati come decorazioni per affrontare questioni trasversali
- Servizio : utilizzato per eseguire attività complesse
- Controller : utilizzato per controllare il flusso di richieste e risposte
- Factory : usato per configurare e / o assemblare oggetti complessi da usare quando un costruttore non è abbastanza buono. Utilizzato anche per prendere decisioni su quali oggetti devono essere creati in fase di esecuzione.
- Repository / DAO : utilizzato per accedere ai dati
Questi sono tutti solo oggetti, ma notate che la maggior parte di essi è generalmente legata a uno schema. Quindi potresti chiamarli "oggetti" o potresti essere più specifico sulle sue intenzioni e chiamarlo per quello che è. Questo è anche il motivo per cui abbiamo modelli di progettazione; per descrivere concetti complessi in alcune opere. DTO è un modello. La radice aggregata è un modello, Visualizza modello è un modello (ad esempio MVC e MVVM). POCO non è un modello.
Un POCO non descrive uno schema. È solo un modo diverso di fare riferimento a classi / oggetti in OOP. Pensalo come un concetto astratto; possono riferirsi a qualsiasi cosa. IMO, esiste una relazione a senso unico, poiché una volta che un oggetto raggiunge il punto in cui può servire solo uno scopo in modo pulito, non è più un POCO. Ad esempio, una volta che contrassegni la tua classe con decorazioni per farla funzionare con qualche framework, non è più un POCO. Perciò:
- Un DTO è un POCO
- Un POCO non è un DTO
- Un modello di visualizzazione è un POCO
- Un POCO non è un modello di visualizzazione
Il punto nel fare una distinzione tra i due riguarda il mantenimento di schemi chiari e coerenti nello sforzo di non incrociare le preoccupazioni e condurre a un accoppiamento stretto. Ad esempio, se si dispone di un oggetto business che ha metodi per mutare lo stato, ma è anche decorato all'inferno con decorazioni EF per il salvataggio su SQL Server E JsonProperty in modo che possa essere rispedito su un endpoint API. Tale oggetto sarebbe intollerante al cambiamento e verosimilmente sarebbe disseminato di varianti di proprietà (ad es. UserId, UserPk, UserKey, UserGuid, in cui alcuni di essi sono contrassegnati per non essere salvati nel DB e altri contrassegnati per non essere serializzati in JSON all'endpoint API).
Quindi, se dovessi dirmi che qualcosa era un DTO, allora probabilmente mi assicurerei che non sia mai stato usato per qualcosa di diverso dallo spostamento dello stato. Se mi dicessi che qualcosa era un modello di visualizzazione, probabilmente mi assicurerei che non sia stato salvato in un database. Se mi avessi detto che qualcosa era un modello di dominio, probabilmente mi sarei assicurato che non dipendesse da qualcosa al di fuori del dominio. Ma se mi avessi detto che qualcosa era un POCO, non mi avresti detto molto.