2013-03-07 4 views
5

Sto provando a creare un'app console che carichi un assembly in runtime che implementa un'interfaccia. Il punto è creare una .dll con istruzioni che possono essere cambiate cambiando la .dll.StructureMap: 'AddAllTypesOf' non aggiunge assembly a ObjectFactory?

La mia soluzione VS2012 esiste di 3 progetti: l'interfaccia, una libreria che lo implementa e un'app per console. (Per questo motivo, tutti e tre hanno il loro spazio dei nomi, forse questo è un problema?) La libreria e la console hanno entrambi riferimenti al progetto dell'interfaccia.

Dopo aver aggiunto gli assembly allo ObjectFactory, non si trovano quando si utilizza GetAllInstances. Si trovano quando si utilizza AssembliesFromPath, ma l'aggiunta non sembra funzionare.

Ecco il mio codice:

var dir = "..\\..\\..\\ComputeLibrary\\bin\\Debug"; 
ObjectFactory.Initialize(cfg => 
{ 
    cfg.Scan(scanner => 
    { 
     scanner.AssembliesFromPath(dir); 
     scanner.AddAllTypesOf(typeof(ICompute)).NameBy(i => i.Name); 
    }); 
}); 
var list = ObjectFactory.GetAllInstances<ICompute>().ToList(); 
list.ForEach(item => item.Test()); 

Nel caso qualcuno voglia di guardare l'intera soluzione, è disponibile here.

Probabilmente sto facendo qualcosa di sbagliato qui, ma non riesco a trovare quello che è. È così che dovrebbe essere usato? O dovrei guardare verso MEF per fare qualcosa del genere?

+1

Secondo la documentazione il tuo codice sembra essere in linea con quanto previsto. L'hai eseguito nel debugger con un punto di interruzione e verificato che l'istanza dello scanner ha l'assembly previsto dopo 'scanner.AssembliesFromPath (dir);' viene eseguita la riga? – cfeduke

+0

Sì, dopo aver eseguito quella linea, lo scanner contiene 2 gruppi: l'interfaccia e la libreria, mentre prima ci sono 0. [screenshot] (http://i.imgur.com/Z0znR0Y.png) – Yves

+0

Cosa succede se eliminare il '.NameBy'? Mi chiedo se forse c'è un'eccezione che viene ingoiata che impedisce alle classi di essere aggiunte allo scanner. – cfeduke

risposta

3

Questo mi ha lasciato perplesso per un po ', finché non ho ricordato this thread nel gruppo di google Structuremap.

Quando si esegue l'applicazione, viene caricato l'assembly ComputeInterface.dll. Quando si esegue la scansione della cartella ComputeLibrary, lo stesso assembly viene caricato di nuovo e ciò confonde Structuremap, poiché l'interfaccia può essere implementata solo da un unico assieme. Prova a eliminare ComputeInterface.dll dalla cartella ComputeLibrary \ bin \ Debug e funzionerà.

+0

Grazie, l'eliminazione della dll dell'interfaccia ha effettivamente risolto il problema. Non l'avrei mai inventato. – Yves

Problemi correlati