2009-08-31 6 views
3
public interface IPlugin 
{ 
    public bool execute(); 
} 

Toutes mes "parties" implémentent cette interface IPlugin. Mes pièces ont évidemment des exigences/offres Import/Export.MEF - Dois-je implémenter IPartImportsSatisfiedNotification

J'écris un système build + config, dans lequel l'utilisateur sélectionne dynamiquement ce qu'il veut, ce qui se traduit par un ensemble de plugins appelés.

Par exemple, voici une liste des plug-ins:

(1) Installer X ... exportations "XTypeInstalled"

(2) Configurer X ... les importations "XTypeInstalled", les exportations "XTypeConfigured"

(3) Installation Y ... importations "XTypeConfigured"

(4) Installation Z

(5) configurer un

Maintenant, un utilisateur peut choisir (1), (3) et (4) ... ou peut sélectionner (1), (2), (3)

Le problème que je suis face est, est-ce que tous mes auteurs de plugins doivent maintenant implémenter IPartImportsSatisfiedNotification? Si ce n'est pas le cas, et que l'utilisateur sélectionne un workflow de (1), (2) et (3) ... comment puis-je appeler la méthode execute() de (3).

Ai-je un sens ?!

+0

On dirait que certaines de vos questions ont été coupées. Il se termine par "Le problème que j'ai est que" –

Répondre

4

Je ne suis pas sûr d'utiliser MEF pour gérer le flux d'exécution d'un programme comme celui-ci. MEF est un excellent choix pour localiser et charger des plugins, mais il est conçu pour très systèmes faiblement couplés, donc vous n'avez pas le niveau de contrôle dont vous avez besoin. Par exemple, bien que le processus de résolution de dépendance fournisse des tâches avec leurs dépendances, il n'y a aucune possibilité d'inspecter la structure de dépendance. Les choses peuvent être difficiles quand, par exemple, vous voulez garantir qu'une tâche ne s'exécute qu'une seule fois, ou lorsque vous voulez remplacer une tâche par une autre.

Ma recommandation est que vous utilisez MEF pour trouver les plug-ins, mais de développer un modèle d'objet riche indépendant de MEF pour les exécuter.

.: par exemple

[Export(typeof(IPlugin)), ExportMetadata("Name", "ConfigureX")] 
public class ConfigureXPlugin : IPlugin { ... 

Utilisez ensuite pour trouver tous MEF les plug-ins disponibles:

public class BuildRunner { 
    [ImportMany] 
    Lazy<IPlugin, IPluginMetadata> plugins[]; 

    void RunBuild(...) { 
    // Figure out which tasks should execute, in which order, and call each of them 

Hope this helps. Si vous rencontrez toujours des problèmes, poster plus d'informations sur votre problème aiderait.

Nick