2009-05-31 7 views
1

Ich arbeite an einem Visual Studio-Add-In für Visual Studio 2008, das eine Strukturansicht mit einer Ansicht des Inhalts eines Serverprodukts anzeigt. Das Serverprodukt enthält verschiedene Arten von Knoten und jeder Knoten verfügt über einen eigenen Kontextmenütyp (Kontextmenü).Der beste Ansatz für die Erweiterbarkeit von Knotentypen und Kontextaktionen in der Forms-Strukturansicht

Für neue Arten von Knoten und die Aktionen, die mit einem Knoten verbunden sind, füge ich gerade Code zwei mein Projekt hinzu. Ich möchte meine Knotentypen und die auf einem Knoten verfügbaren Aktionen in so wenigen trennen, dass ich Knoten und Einträge zum Kontextmenü mit einem Plugin-Modell hinzufügen kann. MEF wäre wahrscheinlich ein guter Kandidat. Hat jemand eine gute Idee, wie man das auf einfache und unkomplizierte Weise implementiert, so dass insbesondere der Plugin-Entwickler nicht viel plumbing machen muss?

Antwort

1

Ich würde eine gemeinsame Bibliothek zur Verfügung stellen, die sowohl mit Ihrem Code als auch mit den Plugin-Bibliotheken verlinkt ist (nennen Sie das die Vertragsabhängigkeit). Definieren Sie dort eine Schnittstelle für einen Knotentyp wie INodeType. Ziehen Sie auch in Betracht, dort einen AbstractNodeType zu implementieren, der INodeType implementiert und einige hilfreiche Eigenschaften bereitstellt, die der Autor des Plugins in seinem Konstruktor festlegen kann.

Eine der Eigenschaften von INodeType ist eine ContextMenu-Eigenschaft, die ein Windows Forms-Kontextmenü zurückgibt.

In Ihrem Code machen eine Eigenschaft:

[Import("NodeTypes", typeof(INodeType))] 
public IEnumerable<INodeType> extensionNodeTypes { get; set; } 

Sie können nur durch das aufzuzählen, nachdem Sie komponiert haben.

Im Plugin-Code, würden sie neue Knotentypen in etwa so erklären (nicht kompilieren):

[Export("NodeTypes", typeof(INodeType))] 
public class SomeNodeType : AbstractNodeType 
{ 
    public SomeNodeType() 
    { 
     this.ContextMenu = base.BuildContextMenu(/* ... */); 
     /* etc. */ 
    } 
    /* ... other custom logic ... */ 
} 

Ich hoffe, dass ich die Syntax nicht vermasseln tat, aber das ist die allgemeine Idee.

+0

Ich fürchte, ich verstehe es noch nicht. Unterstützt dieser Ansatz das Hinzufügen von Plug-Ins, indem nur eine Assembly hinzugefügt (und registriert?) Oder muss die Hauptanwendung neu kompiliert werden? Was tun [Import ...] und [Export ...]? –

+0

Um Plug-Ins hinzuzufügen, müssen Sie lediglich weitere DLLs in das Verzeichnis einfügen, in dem Ihr Code nach Plug-Ins sucht, und es würde alles gefunden, was diesen Vertragsnamen (NodeTypes) dieses Typs (INodeType) exportiert. Meine Antwort geht davon aus, dass Sie eine grundlegende Einführung in MEF haben: http://www.codeplex.com/MEF –

+0

In diesem Fall müssten Sie Ihren Code neu starten, damit er das neue Plugin sehen kann, aber es gibt Beispiele auf dieser Seite wie man "re-komponiert", das neue Plugins ohne Neustart finden kann. –

Verwandte Themen