2010-10-25 17 views
9

Ho una classe in un servizio WCF, chiamiamolo A. A è un contratto dati, che contiene come uno dei suoi DataMembers una raccolta di un altro oggetto personalizzato B. Per evitare problemi riferimento null sul lato client, ho istanziare le BList nel costruttore in questo modo:Devo esporre un costruttore in un DataContract WCF perché funzioni durante l'istanziazione degli oggetti sul client?

[DataContract] 
public class A 
{ 
    [DataMember] 
    public String name { get; set; } 
    [DataMember] 
    public List<B> BList {get; set; } 

    public A() 
    { 
     BList = new List<B>(); 
    } 
} 

mio problema è che sul client, questa esemplificazione non accade e BList appare come null dopo un oggetto di A viene creato sul client. Immagino che il costruttore non appaia sul client. Quindi, devo rendere il costruttore un contratto operativo esplicito? Se così fosse, renderebbe le cose interne visibili al cliente che non dovrebbero vedere, giusto? Come posso assicurarmi che questa istanziazione avvenga sul client?

Grazie, e scusa se questa sembra una domanda stupida.

risposta

2

Non sono sicuro se c'è un modo per fare questo, ma ottenendo la nuova istanza del servizio l'elenco dovrebbe essere inizializzato, suggerisco il seguente

  • Scrivete un metodo web che restituisce una nuova istanza della classe e si potrebbe utilizzarlo come il seguente e io sono sicuro che l'elenco viene inizializzata

Per creare l'istanza:

A a = new ServiceClient.CreateAInstance(); 

Nel servizio scrivere il metodo,

[OperationContract] 
public A CreateAInstance() 
{ 
    return new A(); 
} 
+0

Grazie. Questo probabilmente funzionerà, ma graverebbe il client facendoli chiamare un metodo web semplicemente per istanziare un oggetto. –

3

è necessario utilizzare [OnDeserializing] o [OnDeserialized] attributi di fare l'inizio di tipi DataContract. Vedi http://msdn.microsoft.com/en-us/library/ms733734.aspx

+0

Mi spiace, ho appena visto che il problema è più profondo di quello: vuoi che il * comportamento * dell'inizializzazione di BList sia trasferito al client. Sfortunatamente, non c'è un modo interoperabile per farlo (XSD/WSDL/etc non permettono di descrivere tale semantica), ma puoi ovviamente condividere i tipi (es. Inserisci i tuoi tipi in MyDataContracts.dll e fai svcutil /r:MyDataContracts.dll) se non ti dispiace rompere la natura veramente disaccoppiata/SOA della tua soluzione ... –

Problemi correlati