2009-05-31 14 views
1

Visual Studio 2008のVisual Studioアドインで、サーバー製品のコンテンツのビューを提供するツリービューを表示しています。サーバー製品にはさまざまな種類のノードが含まれており、各ノードには独自のタイプのコンテキストメニュー(右クリックメニュー)があります。フォームツリービューのノードタイプとコンテキストアクションの拡張性に最適なアプローチ

新しいタイプのノードとノードに接続されたアクションについては、現在私のプロジェクトで2つのコードを追加しています。私はノードタイプとそのノードで利用可能なアクションを切断して、ノードやエントリをプラグインモデルでコンテキストメニューに追加できるようにしたいと思います。おそらくMEFが良い候補になるでしょう。誰かがこれを簡単で直接的な方法で実装する方法については良いアイデアを持っているので、特にプラグインの開発者は多くの配管作業をする必要はありませんか?

答えて

1

あなたのコードとプラグインライブラリの両方がリンクされている共通ライブラリを提供します(これはContract依存関係と呼ばれます)。ここには、INodeTypeのようなノードタイプのインタフェースを定義します。また、InodeTypeを実装するAbstractNodeTypeを実装し、プラグインの作成者がコンストラクタで設定できる有用なプロパティを提供することを検討してください。

INodeTypeのプロパティの1つは、Windowsフォームコンテキストメニューを返すContextMenuプロパティです。あなたのコードで

は財産を作る:

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

あなたが構成した後あなたはちょうどそれを列挙することができます。私は私が台無し構文をしませんでした期待し

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

、それは一般的な考え方です:プラグインのコードで

は、彼らがこのような新しいノードタイプのものを(コンパイルされない場合があります)宣言します。

+0

私はまだ理解していないのでしょうか?このアプローチは、アセンブリだけを追加(および登録)することによってプラグインを追加することをサポートしていますか、またはこのためにメインアプリケーションを再コンパイルする必要がありますか? [インポート...]と[エクスポート...]は何をしますか? –

+0

プラグインを追加するには、コードがプラグインを探しているディレクトリにDLLを追加してください。このタイプ(INodeType)のこのコントラクト名(NodeTypes)をエクスポートするものはすべて見つかります。私の答えはあなたがMEFの基本的な紹介を持っていると仮定しています:http://www.codeplex.com/MEF –

+0

この場合、新しいプラグインを見るためにコードを再起動する必要がありますが、再起動せずに新しいプラグインを見つけることができる「再作成」する方法。 –

関連する問題