2010-03-17 7 views
3

Je travaille sur une application dans le Silverlight 4 RC et je prends l'oppertunity pour apprendre MEF pour la gestion des contrôles de plugin. Je l'ai fait fonctionner dans un manoir assez basique, mais ce n'est pas vraiment bien rangé et je sais qu'il existe une meilleure façon d'importer plusieurs xap.MEF + SL4 question

Essentiellement, dans le App.xaml de mon application hôte, j'ai le MEF telling suivante pour charger mon xap de:

AggregateCatalog catalog = new AggregateCatalog(); 

DeploymentCatalog c1 = new DeploymentCatalog(new Uri("TestPlugInA.xap", UriKind.Relative)); 
DeploymentCatalog c2 = new DeploymentCatalog(new Uri("TestPlugInB.xap", UriKind.Relative)); 

catalog.Catalogs.Add(c1); 
catalog.Catalogs.Add(c2); 

CompositionHost.Initialize(catalog); 

c1.DownloadAsync(); 
c2.DownloadAsync(); 

Je suis sûr que je ne suis pas en utilisant pleinement ici la AggregateCatalog et Je dois pouvoir charger n'importe quel xap qui pourrait être dans le répertoire, pas seulement Uri de codage en dur évidemment ....

Aussi, dans le MainPage.xaml.cs dans l'hôte j'ai la collection suivante que MEF met le le plugin est:

[ImportMany(AllowRecomposition = true)] 
public ObservableCollection<IPlugInApp> PlugIns { get; set; } 

Encore une fois, cela fonctionne, mais je suis sûr que je utilise ImportMany mal ....

Enfin, le fichier MainPage.xaml.cs implémente IPartImportsSatisfiedNotification et je donne les résultats suivants pour le traitement une fois le plug-in de chargé:

public void OnImportsSatisfied() 
{ 
    sp.Children.Clear(); 

    foreach (IPlugInApp plugIn in PlugIns) 
    { 
     if (plugIn != null) 
      sp.Children.Add(plugIn.GetUserControl()); 
    } 
} 

Cela fonctionne, mais il semble sale qu'il fonctionne n fois (n étant le nombre de années XAP à charge). Je vais avoir à appeler sp.Children.Clear() comme si je ne suis pas, lors du chargement, mon panneau de pile du 2 plug-in est peuplé comme suit:

TestPlugin A TestPlugin A TestPlugin B

Il me manque clairement quelque chose ici. Quelqu'un peut-il indiquer ce que je devrais faire? Merci!

Répondre

1

Je pense que la plupart de ce que vous faites va bien. Bien que ObservableCollections accepte les notifications d'éléments individuels ajoutés et supprimés, MEF n'en profite pas. Dans votre cas, il va simplement effacer la collection, puis ajouter tous les plugins. Puisque vous utilisez OnImportsSatisfied pour la notification de modification, vous n'avez même pas besoin d'une ObservableCollection. Vous pouvez simplement utiliser un IEnumerable pour votre importation.

Pour ajouter de la flexibilité dans le téléchargement de xaps différents, j'exposerais un service dans votre conteneur qui peut être importé et qui fournit la fonctionnalité pour télécharger un xap donné une URL. Ensuite, n'importe quel composant dans votre conteneur peut déclencher un téléchargement, et l'URL à télécharger peut provenir de n'importe quelle source que vous jugez appropriée.

+0

Merci, c'est à peu près ce que je suis allé et semble être OK pour mes besoins –