2016-11-11 2 views
0

J'ai une application qui est construite avec Prism et MEF. J'ai quelques modules (définis dans la même solution) que je charge et tout fonctionne bien.Utilisation de MEF pour permettre à l'utilisateur d'ajouter des plugins personnalisés, d'exécuter une méthode et de modifier une collection de points de données

Cependant maintenant je voudrais permettre à l'utilisateur d'ajouter leurs propres plugins (fondamentalement ces plugins devraient modifier une collection de points de données) - autrement dit l'utilisateur crée un algorithme (plugin) qui change ces datapoints qui vivent dans un ViewModel.

J'ai besoin de définir une sorte de "contrat" ​​que l'utilisateur doit mettre à jour lors de la création d'un nouveau plugin. Comment ferais-je cela? Le plugin doit être un fichier .dll unique dans un dossier/Plugin et doit être chargé à l'exécution, un ListView doit être rempli dans une vue qui contient un UserControl pour chaque Plugin.

Répondre

2

MEF rendra ce travail vraiment facile et fluide.

Pour les plug-ins:

  1. Créer une interface pour vos plugins. Il n'a pas vraiment besoin d'être très complexe, bien que vous puissiez l'utiliser pour forcer les développeurs à ajouter des informations de description ou de version, et bien sûr une méthode qui reçoit votre collection et la transforme.

  2. Les plug-ins doivent utiliser ExportAttribute pour en informer MEF.

    [Export(typeof(IPlugin))] 
    public class Plugin : IPlugin 
    

Ce devrait être ici peuvent acceuillir.

Pour l'application:

  1. Déclarez une collection qui recevra la liste des plugins qui pourrait trouver MEF, n'oubliez pas les ImportManyAttribute.

    [ImportMany(typeof(IPlugin))] 
    public IEnumerable<IPlugin> Plugins{ get; set; } 
    
  2. Créez votre catalogue et votre conteneur. Sur le code que je montre, j'ajoute deux catalogues, peut-être que vous n'en avez pas besoin, juste pour que vous sachiez que vous pouvez avoir plus d'une source.

    AggregateCatalog catalog = new AggregateCatalog(); 
    catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetEntryAssembly())); 
    catalog.Catalogs.Add(new DirectoryCatalog("plugins")); 
    var container = new CompositionContainer(catalog); 
    
  3. Faites la magie. Bien sûr this devrait être l'objet avec que ImportManyAttribute.

    container.ComposeParts(this);