2009-11-17 16 views
5

J'essaie le cadre d'extensibilité géré pour la première fois dans Visual Studio 2010 beta 2 à l'aide de System.ComponentModel.Composition à partir de .net-4.0.Demander à MEF d'utiliser tous les assemblages disponibles

Je n'ai pas réussi à obtenir le composant CompositionContainer pour trouver mes assemblys d'implémentation en utilisant les deux routines alternatives ci-dessous.

Première tentative (cela a fonctionné dans une ancienne version CodePlex du MEF):

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

deuxième tentative (cela a fonctionné en version bêta 1, je pense):

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

Y at-il une nouvelle façon faire cela en beta 2?

EDIT: Cela n'a rien à voir avec la composition. J'ai eu une propriété statique représentant ma mise en œuvre importée:

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

qui aurait dû être:

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

Je marqué la réponse de Daniel acceptée parce que le sage conseil de débogage d'une façon plus approfondie a résolu le problème.

+0

J'utilise Beta 2 pour quelques semaines et ont été en utilisant votre 2ème exemple sans aucun problème. Avez-vous des pièces internes dans votre assemblage en cours d'exécution ou sont-elles simplement situées dans BaseDirectory? Avez-vous été en mesure de confirmer à quoi correspond AppDomain.CurrentDomain.BaseDirectory lors de l'exécution? En outre, la classe qui contient les extraits ci-dessus contient-elle des importations déclarées? Juste en faisant attention car rien ne sera ramassé si l'instance de la classe (this) n'a pas d'importations – JamesEggers

+0

Je dois faire quelque chose de daft. Les implémentations sont simples pendant que j'essaye de le faire fonctionner. BaseDirectory est valide, la classe a les importations. Pourtant, un peu plus de tête et je vais y arriver à la fin. – grenade

+0

Quelqu'un peut-il expliquer pourquoi il n'est pas possible d'utiliser [Import] pour une propriété statique? – Dave

Répondre

1

Qu'est-ce qui échoue? Y a-t-il une importation à laquelle vous vous attendez qui n'est pas satisfaite? Appelez-vous GetExports() et il échoue?

Vous pouvez interrompre le débogueur une fois le catalogue créé, et passer la souris sur la variable aggregateCatalog pour l'inspecter et voir les parties qui s'y trouvent. Je suppose que les pièces sont probablement dans le catalogue, et le problème est ailleurs dans votre code. Une cause probable est que vous avez une importation de collection qui utilise l'attribut [Import] au lieu de [ImportMany], et/ou que vos pièces sont rejetées parce qu'elles ont des importations qui ne peuvent pas être satisfaites.

0

Si vous jetez un coup d'oeil à la méthode Compose dans le SoapBox Core Host, vous pouvez le voir en utilisant un DirectoryCatalog pour trouver toutes les parties dans le répertoire. Cependant, ce n'est pas compilé 4 .NET, juste contre la version préliminaire de 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; 
    }