2013-06-13 20 views
5

Ho una soluzione che ha tre strati: comuni, dati e attivitàservizio e Project miscelazione Referenze

Lo strato comune definisce gli oggetti che sono essere referenziate e utilizzati da altri strati. Il livello dati contiene il codice di accesso ai dati e il livello aziendale contiene la logica aziendale. Ogni livello contiene più progetti.

I livelli di dati e di business espongono i servizi WCF che hanno oggetti dal livello comune come parametri. Sia i dati che i livelli aziendali fanno riferimento allo strato comune direttamente tramite i riferimenti del progetto.

Il livello aziendale fa riferimento al livello dati tramite un riferimento di servizio. I riferimenti del servizio sono impostati su "Riutilizza i tipi negli assiemi di riferimento" poiché esistono più riferimenti ai servizi del livello dati in un singolo progetto del livello aziendale e ciascuno dei servizi del livello dati utilizza gli stessi oggetti dal livello comune.

Sto scrivendo unit test per il livello aziendale e sto ricevendo continuamente errori come questo: Valore di tipo Common.ClassName non può essere convertito in Common.ClassName. La mancata corrispondenza di tipo potrebbe essere dovuta al mixaggio di un riferimento di file con un riferimento di progetto all'assembly Common. Prova a sostituire il riferimento del file con un riferimento al progetto.

Non è un riferimento di file, è sicuramente un riferimento di progetto. Looking here I see this item

Per accedere a un tipo definito in un altro assieme, il compilatore di Visual Basic deve avere un riferimento a tale assembly. Questo deve essere un riferimento unico e non ambiguo che non causa riferimenti circolari tra i progetti.

Per quanto mi riguarda posso dire che non ho alcun riferimenti circolari in modo da quali altri problemi potrebbero causare questo messaggio di errore e/o come posso evitare questo spreco di così tanto del mio tempo facendo clic sul riferimento al servizio di aggiornamento e sperando che questa volta funzionerà?

Nota che non ho una scelta su questa architettura, è imposta dal nostro architetto del software.

L'ambiente è Windows 8 con Visual Studio 2012.

+1

Solo per assicurarsi che non ci siano riferimenti circolari. Assembly (A) delle DLL non ha un riferimento a Assembly (B) che dipende da Assembly (C) in fase di compilazione, ma Assembly (C) ha un riferimento a Assembly (A) .... – Skindeep2366

+0

Ho controllato per riferimenti circolari più volte. Sono abbastanza sicuro che non è questo il problema. –

risposta

0

Perché il vostro livello di business fa riferimento al livello di dati tramite riferimento al servizio e lo strato di dati ha un riferimento al vostro livello comune si fa, infatti, hanno un riferimento circolare. Questo viene fatto dal codice gen in background quando si genera il riferimento wcf.

È abbastanza comune quando si creano servizi wcf (per la prima volta) per i programmatori. La soluzione nel tuo caso è garantire che qualsiasi oggetto (classe, classe datacontract, ecc.) Che viene inviato via cavo tramite WCF sia nello stesso assembly del file di interfaccia wcf. Per dirlo in un altro modo se la chiamata alla funzione del servizio WCF o la subroutine accetta o restituisce un oggetto, quell'oggetto dovrebbe trovarsi nello stesso assembly (o in un assembly non referenziato a valle del servizio).

Se li dividi, crea un riferimento circolare senza rendersene conto perché WCF crea automaticamente le versioni lato client dei contratti dati lato server automaticamente. Potresti essere in grado di disattivare questo comportamento ma non so esattamente in che modo suggerirei di googling. Se questi file di contratto di dati lato server sono in effetti nella classe comune, allora hai un riferimento circolare perché il tuo livello aziendale ha le versioni generate dal codice di questi file e anche il riferimento all'assembly comune.

Per ulteriori informazioni su questo approfondire il codice generato nel riferimento del servizio. Per fare questo è necessario attivare la visualizzazione della funzione di tutti i file in Visual Studio Solution Explorer e quindi iniziare a scavare nel codice generato per te quando crei quel riferimento di servizio.

+0

Quello che stai descrivendo non è un riferimento circolare, A> B> C> A, ma un albero A> B> C & B> C –

Problemi correlati