2010-12-28 16 views
8

Ho due progetti di classe in una soluzione di Visual Studio. A causa della natura del progetto, entrambi i progetti si riferiscono tra loro perché hanno bisogno dei rispettivi servizi (si pensi alla frase "I scratch your back, you scratch").Risoluzione di depenency circolare

Visual Studio (2010) non consente di aggiungere un riferimento al progetto b dal progetto a, perché progetto già un progetto di riferimento b.

Quali strategie ci sono per risolvere questa dipendenza circolare?

Grazie

risposta

8

Ci sono due approcci tipici che è possibile utilizzare:

1) si combinano entrambi i progetti in un unico progetto.

alt text

2) Trovare le parti comuni dei due progetti e li fattorizzare in un terzo progetto separato.

alt text

+0

il punto 2 è molto più orientato all'OOP. –

2

Nessuno oltre "Devo romperlo". Separare i due o combinarli in un singolo modulo.

4

refactoring i servizi indipendenti (quelli che non dipendono da altri progetti) ad una terza libreria di classi e avere entrambi i progetti fanno riferimento a questo terzo.

D'altra parte, se i due progetti sono così strettamente accoppiati, allora si dovrebbe anche considerare di unirli in un unico progetto.

1

Un progetto può esporre le interfacce implementate dall'altro progetto e quindi non è più necessario un riferimento all'altro progetto.

0

Abbiamo avuto una situazione simile in cui è necessario ottenere chiamata dbCon class per ottenere la stringa dbConnection dal progetto a al progetto b. L'abbiamo risolto memorizzandolo nella tabella dbconfig nel database e passandolo come parametro al progetto b.

0

Probabilmente la soluzione giusta è quella di interrompere parte del "progetto a" e "progetto b" in un "progetto c". Quindi A e B dipendono entrambi da C, e nessuno dei due dipende dall'altro.

Non esiste un modo possibile di avere una vera dipendenza circolare, al di fuori di alcuni processi di build incrementali in cui si genera A.dll che contiene tutto ciò di cui B.dll ha bisogno ma che B.dll non ha bisogno, quindi sostituirlo con uno nuovo che è stato creato utilizzando il B.dll di nuova generazione e contiene elementi che dipendono da esso. Alla fine, una strategia così complessa non sarebbe certamente valsa la pena.

Potrebbe anche essere possibile creare netmodules e successivamente unirli in un assembly utilizzando Assembly Linker, ma ancora una volta, il risultato non giustificherebbe lo sforzo richiesto.