2009-11-17 17 views
5

Sto provando il Managed Extensibility Framework per la prima volta in Visual Studio 2010 beta 2 utilizzando System.ComponentModel.Composition da .net-4.0.Indicare a MEF di utilizzare qualsiasi assembly disponibile

Non riesco a ottenere il CompositionContainer per trovare i miei assembly di implementazione utilizzando le due routine alternative di seguito.

Primo tentativo (questo ha funzionato in una versione precedente CodePlex del MEF):

var composition = new CompositionBatch(); 
composition.AddPart(this); 
var container = new CompositionContainer(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
container.Compose(composition); 

Secondo tentativo (questo ha funzionato in beta 1, credo):

var aggregateCatalog = new AggregateCatalog(
    new AssemblyCatalog(Assembly.GetExecutingAssembly()), 
    new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
var compositionContainer = new CompositionContainer(aggregateCatalog); 
compositionContainer.ComposeParts(this); 

C'è un modo nuovo per fare questo nella beta 2?

EDIT: Si è scoperto che non ha nulla a che fare con la composizione. Ho avuto una proprietà statica che rappresenta la mia implementazione importati:

[Import] public static ILog Log { get; set; } 

che avrebbe dovuto essere:

[Import] public ILog Log { get; set; } 

ho segnato la risposta di Daniel accettata perché il saggio consiglio di debug in modo più approfondito ha risolto il problema.

+0

Sto usando Beta 2 per un paio di settimane e sono state usando il tuo secondo esempio, senza alcun problema. Avete parti interne nel vostro gruppo di esecuzione o si trovano nella BaseDirectory? Sei stato in grado di confermare a quale applicazione AppDomain.CurrentDomain.BaseDirectory corrisponde in fase di runtime? Inoltre, la classe che contiene gli snippet sopra riportati contiene le importazioni dichiarate? Mi sto solo assicurando che nulla verrà raccolto se l'istanza della classe (questo) non ha importazioni – JamesEggers

+0

Devo fare qualcosa di stupido. Le implementazioni sono semplici mentre cerco di farlo funzionare. La BaseDirectory è valida, la classe ha le importazioni. Ancora, un po 'più di headscratching e ci arriverò alla fine. – grenade

+0

Qualcuno può spiegare perché non è possibile usare [Importa] per una proprietà statica? – Dave

risposta

1

Che cosa sta fallendo? C'è un'importazione che ti aspetti di essere soddisfatta e che non è soddisfatta? Stai chiamando GetExports() e non funziona?

È possibile interrompere il debugger dopo aver creato il catalogo e passare il mouse sulla variabile aggregateCatalog per ispezionarlo e vedere quali parti ci sono dentro. La mia ipotesi è che le parti siano probabilmente nel catalogo e il problema è da qualche altra parte nel codice. Una causa probabile è che si dispone di un'importazione di raccolta che utilizza l'attributo [Importa] anziché [ImportaMany] e/o che le parti vengono rifiutate perché hanno importazioni che non possono essere soddisfatte.

0

Diamo un'occhiata al metodo Compose nello SoapBox Core Host, è possibile vederlo utilizzando un DirectoryCatalog per trovare tutte le parti nella directory. Tuttavia, questo non è compilato contro .NET 4, solo contro la versione di anteprima del MEF:

private bool Compose() 
    { 
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new DirectoryCatalog(".")); 

     _container = new CompositionContainer(catalog); 

     try 
     { 
      _container.ComposeParts(this); 
     } 
     catch (CompositionException compositionException) 
     { 
      MessageBox.Show(compositionException.ToString()); 
      return false; 
     } 
     return true; 
    } 
Problemi correlati