Proprietà "cicliche" in WCF
JoeRuspante
JoeRuspante non è online. Ultima attività: 07/02/2010 12.31.05JoeRuspante
l'1 giugno 2009 alle 02:29
156 messaggi dal 08 febbraio 2009
Salve a tutti.

Supponiamo di avere due classi: Fatture e DettaglioFattura.

Essendo queste classi "legate fra loro", viene a crearsi un riferimento "ciclico". A quanto pare WCF non mi consente di inviare i dati al servizio.

Spiego meglio la questione.

Creiamo una fattura simile alla seguente:



Fattura f = new Fattura();
f.numero = 1;
f.Dettagli = new List<DettaglioFattura>();

DettaglioFattura d = new DettaglioFattura();
d.Descrizione = "prova";

f.Dettagli.Add(d);


Anche se il codice sembra corretto, c'è una anomalia: la variabile d (che è un DettaglioFattura) ha la proprietà "Fattura" che è null.
Infatti abbiamo legato le righe alla fattura, a non il contrario.

Pertanto, riscrivo il codice nel seguente modo:



Fattura f = new Fattura();
f.numero = 1;
f.Dettagli = new List<DettaglioFattura>();

DettaglioFattura d = new DettaglioFattura();
d.Descrizione = "prova";

f.Dettagli.Add(d);

... riga aggiunta ....
d.Fattura = f;



In questo caso, però, se provo a passare la variabile "f" al WCF, questo mi esce con errore perchè c'è un riferimento ciclico.


Qualcuno sa come aggirare il problema?
RE: Proprietà "cicliche" in WCF
Ricciolo
Ricciolo non è online. Ultima attività: 06/02/2010 11.33.28Ricciolo Top Poster
l'1 giugno 2009 alle 11:34
Beh non fare riferimenti ciclici
Solitamente si descrivono i contratti i modo che il padre hai i figli ma i figli non hanno un riferimento al padre. D'altronde deve serializzare in XML e i riferimenti circolari non sono rappresentabili.
Se invece vuoi tenerti le entità originali, puoi marcare la proprietà che punta al padre con l'attributo IgnoreDataMember così non viene serializzata. Oppure puoi usare questa tecnica
http://www.winfxitalia.com/script/123/Intercettare-Eventi-Serializzatore-WCF.aspx

Ciao

Il mio blog
Homepage
RE: Proprietà "cicliche" in WCF
JoeRuspante
JoeRuspante non è online. Ultima attività: 07/02/2010 12.31.05JoeRuspante
l'1 giugno 2009 alle 18:38
156 messaggi dal 08 febbraio 2009
Grazie della dritta (anche se non capisco la differenza fra IgnoreDataMember o non mettere DataMember).

Il mio problema, però, è un po' più complesso in quanto ci sono situazioni in cui ho bisogno di avere quel legame.


Mi spiego con un esempio.
La mia applicazione ha l'anagrafica "Clienti" e "Aziende", dove ciascun cliente può avere più aziende.

Pertanto la classe Cliente ha la proprietà IList<Azienda> e ciascuna azienda ha la proprietà Cliente.

Quando sono dentro all'anagrafica Clienti (WPF), allora devo avere caricato l'elenco delle Aziende per visualizzarle in un list-view.

Nel resto del programma, però, lavoro utilizzando sempre e solo l'azienda. In tal caso mi serve avere il riferimento al Cliente di cui l'azienda fa parte (per fare dei controlli e per visualizzare delle info a video).

Essendo la classe Azienda sempre la medesima, come faccio a dire:
-) Se sei all'interno di un elenco, non caricare la proprietà Cliente
-) Se sei fuori dall'elenco, allora carica il campo Cliente

L'unica cosa che mi viene in mente è creare due DTO distinti... C'è di meglio?
RE: Proprietà "cicliche" in WCF
Ricciolo
Ricciolo non è online. Ultima attività: 06/02/2010 11.33.28Ricciolo Top Poster
il 3 giugno 2009 alle 09:18
Ed è per queste esigenze che come ti ho suggerito all'inizio, le classi wcf sono solo un rappresentazione dell'xml che passa. Le tue classi con referenze circolari, supporto al binding ecc dovrebbero essere una cosa a parte, così non hai più questo problema.

Ciao

Il mio blog
Homepage

 

Torna al forum |   Feed RSS
ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
COMMUNITY
ULTIMI MESSAGGI
UTENTI ONLINE
MEDIA
IN EVIDENZA
MISC
Powered by .db Forums "Caesar Reborn" v. 2010.2.8