2011-01-28 6 views
7

Ho esaminato molti esempi di WCF utilizzando EntityFramework e molti di essi sembrano restituire al client una sorta di classe POCO o DTO.Un servizio WCF deve restituire una classe EntityObject o POCO/DTO?

Mi chiedevo il motivo per cui questo era il default EntityObject include gli attributi [DataContract]INotifyPropertyChanged. Restituire una classe DTO o POCO migliore di una EntityObject (o viceversa)? Esistono casi specifici in cui è preferibile utilizzare un valore di ritorno su un altro?

+1

possibile duplicato di [WCF, Entity Framework & Data Contracts] (http://stackoverflow.com/questions/1121877/wcf-entity-framework-data-contracts) –

risposta

8

Come best practice, è consigliabile restituire una classe DTO/POCO progettata esplicitamente come contratto dati e senza logica di persistenza.

Il motivo è che, se si passa un oggetto EntityObject, si presuppone che il consumatore del servizio avrà un riferimento allo stesso contesto di dati e questo viola il principio SOA dei limiti espliciti. Riduce la riusabilità del tuo servizio.

È probabile che Microsoft abbia implementato DataContract su EntityObject per supportare alcuni dei loro strumenti di accesso al database basati su WCF come RIA. INotifyPropertyChanged è per il supporto di binding WPF e non è correlato a WCF o contratti di dati.

+0

Grazie. È normale ricondurre il DTO in EntityObject sul client o è preferibile creare un nuovo modello per gli scopi del cliente? – Rachel

+0

Ovviamente ciò dipende dalla tua architettura, ma se il client ha una copia locale del database, puoi riconvertire il DTO a EntityObject. Il punto è mantenere il contratto pulito in modo che il servizio non implichi alcuna implementazione specifica, fornisce solo i dati in un formato vanilla. –

+0

Il client dovrebbe funzionare solo con DTO, che è il tipo fornito dal servizio che consuma ed è più semplice, naturalmente. A meno che tu non abbia la necessità di utilizzare il contesto sul client con tutte le funzionalità delle entità per qualche ragione (che dubito perché è un client giusto?). – kzfabi

0

Vale la pena restituire il POCO in alcuni casi in cui non si è a conoscenza della logica di persistenza. Intendo che lo stesso POCO può essere collegato ad altri ORM o per altri scopi. Ok questo è un vantaggio di POCO su ORM ma offre anche un incremento delle prestazioni su EntityObject che aggiunge tempo di esecuzione di proxy/notificatori.

Restituzione POCO - È necessario aggiornare manualmente lo stato dell'entità quando ricevuto da WCF.

Returning EntityObject - Si riceve l'entità con stato mantenuto.

Problemi correlati