Domanda

Si supponga che questo semplice scenario: Il mio cliente ha un'applicazione .NET già al lavoro e lui / lei vuole esporre alcune funzionalità attraverso WCF. Così me uno dà assemblaggio, containg una classe pubblica che espone il metodo followig.

OrderDetail GetOrderDetail (int orderId) // Suppose OrderDetail has {ProductId, Quantity, Amount)

Ora, voglio alcuni membri della OrderDetail (Importo) di non essere serializzato. Secondo http://msdn.microsoft.com/en-us/library/aa738737 aspx , il modo per farlo è mediante l'attributi [IgnoreDataMember] [DataContract] e [DataMember] /. Tuttavia, questo non è un'opzione per me perché non riesco a modificare il codice sorgente del client. Quindi sto cercando un modo per specificare quali membri voglio serializzare fuori, al di fuori la definizione del tipo. Qualcosa che dovrebbe essere simile a questo:

    [OperationContract]
    [IgnoreMember(typeof(OrderDetail), "Amount" )]
    OrderDetail QueryOrder(int orderId){
          return OrderDetail.GetOrderDetail(orderId)  
    }

C'è un modo per per questo? Grazie, Bernabé

È stato utile?

Soluzione

Non inviare il client oggetti attraverso il filo, creare un DTO da parte dei clienti oggetto che contiene solo le informazioni che si desidera inviare e inviare che invece.

Questo consente di controllare esattamente quali informazioni viene inviato, ed è in linea con le intenzioni della WCF di passare messaggi e non oggetti

Quindi, creare un OrderDetailDto class e popolano questo con i dati dal OrderDetail restituito dalla chiamata al metodo nel codice client. Decorare La OrderDetailDto con gli attributi DataContract e DataMember (è possibile rinominare la classe qui in modo che quando viene restituito da WCF è tornato con il nome OrderDetail)

Ripetere questo per tutti gli oggetti nel codice client, in modo che al limite di servizio che, fondamentalmente, la conversione da DTO-> oggetti client e client Oggetti-> DTO

Modifica

Mentre ci potrebbe essere un'opzione che permette quello che hai chiesto (io non sono a conoscenza di uno, ma si spera che qualcun altro potrebbe essere) ritengono che quando si invia utilizzare gli oggetti client come DTOs li sta utilizzando per due scopi ( l'oggetto client e il contratto messaggio), che è contro la Responsabilità unico principio e quando li si arriva sul lato client non saranno gli stessi oggetti lato client, solo DTOs con le stesse proprietà, non sarà in grado di ottenere un comportamento negli oggetti lato client (almeno non senza condividere le librerie sul lato server e lato client).

Legandosi il contratto di dati per gli oggetti che anche finire per dover gestire le modifiche a oggetti client e contratti di dati come una cosa sola. Quando sono separati è possibile gestire le modifiche agli oggetti lato client, senza cambiare le neccessarily DTOs, si può solo popolano il modo diverso.

Mentre sembra che sia un sacco di lavoro per creare il DTOs, alla fine penso che sarà valsa la pena.

Altri suggerimenti

Si dovrà scrivere una classe wrapper che espone solo le proprietà desiderate e chiede semplicemente la classe vostro client fornito ottiene i suoi valori.

L'unica altra opzione sarebbe quella di emettere una nuova classe dinamica utilizzando la riflessione e serialize che (vedi http://msdn.microsoft.com/en-us/library/system.reflection.emit.typebuilder.aspx ), ma la sua probabilmente non vale la pena a meno che non è necessario per costruire un sacco di classi wrapper.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top