2010-05-17 2 views
0

J'ai une question stratégique pour mon projet C#. Je veux mettre en œuvre un concept de plugin et je me bats maintenant avec la meilleure façon pour les plugins de manipuler les données du projet principal. Dans un premier temps, j'ai créé un projet "Master" PlugIn qui définit l'interface pour les plugins et un attribut pour identifier une classe comme un plug-ins quand je le charge dans mon projet principal.Manipulation de données dans PlugIn-Concept

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)] 
public sealed class GraphViewerPlugInAttribute : Attribute 
{ 
} 

public interface IGraphViewerPlugIn 
{ 
    Panel GetRightSidePanel(); 
    string Name(); 
} 

Ce projet est ensuite référencé dans le projet principal et les plug-ins. Le plug-ins implémente l'interface ...

[GraphViewerPlugIn] 
public class myTestPlugIn : IGraphViewerPlugIn 
{ 
    public Panel GetRightSidePanel() 
    { 
    Panel myPanel = new Panel(); 
    myPanel.BackColor = System.Drawing.Color.Red; 

    return myPanel; 
    } 

    public string Name() 
    { 
    return "TestPlugIn"; 
    } 
} 

... et le projet principal charge tous les plugins qui sont stockés dans un certain répertoire.

Cela fonctionne très bien jusqu'à présent, je peux obtenir le panneau spécial à partir du PlugIn, mais maintenant je veux manipuler les données du projet principal à partir du PlugIn. Quelle serait la meilleure façon de le faire? J'ai une sorte de classe de conteneur de données qui est définie dans le "Master Plugin Project" à l'esprit. Le plugin met les données dans ce conteneur et le projet principal sera reconnu par un événement que les données ont changé et peut maintenant regarder quelles données ont changé et ensuite appliquer les changements. Est-ce la bonne direction, qu'est-ce que je dois considérer et quelles techniques (c'est-à-dire les événements, les classes statiques ...) dois-je utiliser pour mettre en œuvre cela?

Répondre

0

Une approche consiste à ajouter un bouton de configuration qui active une méthode sur l'interface conçue pour la configuration.

Cette méthode peut utiliser n'importe quel code pour configurer le plug-in, y compris faire ses propres appels aux formulaires Windows. Si vous utilisez Windows Forms ou WinFx, et non une interface utilisateur personnalisée, c'est la méthode idéale car elle supprime toute la logique liée au plugin de l'application elle-même, sauf pour notifier qu'une fenêtre de configuration a été demandée.

public interface IGraphViewerPlugIn 
{ 
    Panel GetRightSidePanel(); 
    string Name(); 
    void ShowConfigurationDialog(); 
} 

Bien sûr, vous implémentez alors ShowConfigurationDialog en tant que tel:

public void ShowConfigurationDialog() 
{ 
    Form form = new MyConfigurationDialog(); 
    form.ShowDialog(); 
} 

où MyConfigurationDialog est votre formulaire créé concepteur pour configurer le plug-in.