2010-02-18 9 views
16

Ho una soluzione C# ed è composta da numerosi progetti.C# domanda di riferimento del progetto

Ho un progetto che è il mio baseassemblies che contiene tutte le informazioni comuni utilizzate da altri progetti. Tutti gli altri progetti hanno riferimenti a baseassemblies.

Ho aggiunto un riferimento a dll nei miei gruppi base, ma tutti gli altri progetti non possono vederlo.

Come posso fare in modo che gli altri progetti possano vedere la DLL a cui fanno riferimento i baseassemblies? Non voglio dover aggiungere la DLL a tutti i progetti poiché ciò sconfigge lo scopo del mio progetto baseassemblies.

risposta

23

L'approccio corretto è per gli altri assembly NON è necessario un riferimento a quell'altra DLL. Il modo per farlo correttamente, è di non avere gli assembly di base esporre nessuno dei tipi che si trovano all'interno di quella DLL. Riunisci tutte le funzionalità necessarie negli assiemi di base e assicurati che chiunque usi gli assiemi di base non abbia alcuna conoscenza degli assiemi di base della DLL sottostante. Altrimenti, ogni progetto che farà riferimento ai tuoi assembly di base, se hanno bisogno di usare qualcosa che è contenuto in quella DLL, dovranno farvi riferimento.

+2

+1 mi hai battuto.Sono d'accordo al 100% –

+2

Questo non è pratico in molti casi con codebase di grandi dimensioni. È una buona risposta "teorica", ma richiede molto sforzo in più nella codifica e nei test per farlo accadere (spesso) senza valore aggiunto. Non sto dicendo che è * mai * appropriato, ovviamente ... –

9

Non ci sono riferimenti transitivi in ​​.NET. Se un assembly deve fare riferimento a un altro, deve farlo direttamente, non può "ereditare" quel riferimento da un altro riferimento.

Nota: un progetto deve solo fare riferimento agli assiemi da cui utilizza direttamente i tipi. Se A usa B e B usa C, ma A non usa direttamente C, allora A ha solo bisogno di fare riferimento a B direttamente (il caricatore gestirà B facendo riferimento a C).

3

In breve, non puoi farlo. È necessario aggiungere un riferimento alla DLL contenente il codice che si sta tentando di utilizzare altrimenti non sarà in grado di vederlo.

Il mio suggerimento sarebbe quello di creare un livello nel progetto 'BaseAssemblies' a cui è possibile accedere dall'applicazione che essenzialmente crea un'architettura a livelli.

esempio

Livello applicazione - Utilizza IDataClass
Business Logic Strato - Definisce Strato IDataClass
Data Access - MyRawDataClass (implementa IDataClass)

Dall'esempio, il livello di applicazione necessita solo di un riferimento al BAL per poter interagire con il DAL.

0

È possibile avere le interfacce di esportazione BaseAssemblies che devono essere implementate dalla dll "altro". Inoltre, i tuoi BaseAssembly necessitano di alcune funzionalità di "class factory" per tali classi.

0

Altri poster sono corretti: non puoi farlo. Questo è, IMHO, patetico da parte di Visual Studio. "make" gestito questo pulito come torta 20 anni fa ...

0

Ci sono casi in cui il tuo progetto si riferisce A che a sua volta si riferisce a B ma quando si costruisce, B non è sempre lì nella cartella BIN e si realizza solo questo quando il codice è in esecuzione. C'è una domanda SO relativa HERE. La gente l'ha risolto in modi bizzarri, ma mi è piaciuta particolarmente la soluzione di John Hunter. Questo SO thread discute anche una soluzione in cui si utilizzano gli eventi di compilazione per ottenere i risultati desiderati.