2010-03-26 12 views
7

Mi manca qualcosa di base quando si tratta di utilizzare MEF. L'ho fatto funzionare utilizzando campioni e una semplice app per console in cui tutto è nello stesso assembly. Quindi inserisco alcune importazioni ed esportazioni in un progetto separato che contiene varie entità. Voglio utilizzare queste entità in un test MS, ma la composizione non viene mai effettivamente eseguita. Quando sposto la composizione nel costruttore di un'entità in questione funziona, ma è ovviamente sbagliato. Solo GetExecutingAssembly "vede" il processo di test? Cosa mi manca nei contenitori? Ho provato a mettere il contenitore in un Utilizzo nel test senza fortuna. I documenti MEF sono ancora molto scarsi e non riesco a trovare un semplice esempio di un'applicazione (o MS Test) che utilizza entità di un progetto diverso ...MEF non trova parti negli altri gruppi

risposta

9

In .NET, ogni file exe o DLL viene chiamato un assembly . Pertanto, quando si crea un catalogo basato sul "gruppo di esecuzione" e lo si utilizza nel punto di ingresso dell'applicazione, vengono incluse solo le parti definite all'interno del progetto exe. Non si ottengono parti definite nelle DLL.

provare a sostituire questo:

var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 

da questo:

var catalog = new AggregateCatalog(
    new ComposablePartCatalog[] 
    { 
     new AssemblyCatalog(Assembly.GetExecutingAssembly()), 
     new DirectoryCatalog(".") 
    }); 

edit: Ho appena scoperto che c'è una soluzione più semplice:

var catalog = new DirectoryCatalog(".", "*"); 

() In realtà, un assembly può essere costituito da più file, ma questo è usato raramente. Il termine viene utilizzato anche per la COM affiancata.

3

Sì. È necessario assicurarsi di aggiungere il proprio assieme (quello con importazioni ed esportazioni) al catalogo prima della composizione. In questo modo, può trovare le parti appropriate.

GetExecutingAssembly fa esattamente quello che dice: ottiene l'assembly attualmente in esecuzione, ovvero quello che ha scritto quel codice specifico. Nel tuo caso, questo è il test assembly, non il tuo progetto "library".

Fare in modo che il test aggiunga esplicitamente il progetto di libreria al catalogo e molto probabilmente funzionerà come previsto.