2011-01-24 7 views
7

私が取り組んでいるアプリケーションの1つに、作成と更新の2つの基本機能が含まれています。複数のアセンブリにわたって部分的なメソッドを実装する

しかし、時には、カスタムコードを追加する必要があるので、私はサードパーティが独自のコードを記述して埋め込むようにすることによって、コードの延長と考える:

OnCreating OnCreated OnUpdating OnUpdated

上記を複数のアセンブリにわたって有効にする方法はありますか? MEFがここで助けてくれる?

は、あなたの返信用


おかげで、すべての よろしくお願いします。

このようなインターフェイスを持つことは、各外部アセンブリが必要に応じてそのインターフェイスを実装する必要があることを意味します。次に、私のアプリケーションのコードは、現在実行中のアセンブリをループし、そのインタフェースを実装するすべてのクラスを検出し、メソッドを実行する必要がありますか?

MEFはここに適合しますか?実装を外部アセンブリからエクスポートして、アプリケーション内にインポートできますか?

あなたはCLRの機能部分クラスは、言語機能であるため、particalクラスaccrossアセンブリを持って、そしてないことはできません よろしく

答えて

2

、上記のコードはもっと似ています:

var catalog = new DirectoryCatalog("bin"); 
var container = new CompositionContainer(catalog); 
container.ComposeParts(); 

var plugins = container.GetExportedValues<IPlugin>(); 
foreach (IPlugin plugin in plugins) 
{ 
    plugin.OnCreating += MyOnCreatingHandler; 
} 

私はthが好きだと思います指定したメソッド名の後者です。私のプラグインの仕事のために、私は次のようなインターフェイスを作成しました:

public interface IPlugin 
{ 
    void Setup(); 
    void RegisterEntities(); 
    void SeedFactoryData(); 
} 

RegisterEntities()メソッドは、実行時にデータベーススキーマを拡張し、SeedFactoryData()方法は、例えば(任意のデフォルトのデータを追加し、デフォルトのユーザーを追加し、前。都市表の人口など)。

14

ありがとうございます。 C#コンパイラは、すべての部分クラスを1つの実クラスにマージし、その1つのクラスだけがコンパイル後に残します。

あなたは選択肢のカップルがあります

  1. オファーイベント
  2. は、方法は、仮想作成し、それらを
  3. をオーバーライドするあなたの問題インターフェース

を使用し、それは最高のイベントに合うように見えます。ユーザーは、他のアセンブリで簡単に登録することができます。

1

アセンブリ間で部分クラスをサポートすることはサポートされていません。

コンパイル時にすべての部分クラス定義が単一のクラスに結合されているのは、その理由です。その単一のクラスは単一のアセンブリ内にあります。

0

部分的なメソッドとクラスは、同じアセンブリ内になければなりません。一部のメソッドは、使用されないとコンパイルされます。クラスの拡張ポイントが必要な場合は、仮想メソッドやイベントを調べる必要があります。

1

インタフェース使用を検討してください:

IUpdatableObject<X> 
    Creating(X obj); 
    Created(X obj); 
    Updating(X obj); 
    Updated(X obj); 

そしてカスタムコードに追加するには、このインターフェイスを使用します。各サードパーティはこのインターフェイスを実装できます(ラッパーを使用することもできます)。カスタムビジネスロジックを追加することができます。

HTH。

+0

完全なソースコードを含む完全なサンプル? – Kiquenet

1

あなた(またはユーザー)は、拡張メソッドを使用することができます。部分クラスの背後にある考え方は、複数の開発者が同じのためのさまざまな方法とメンバーを貢献できるようにすることですので、アセンブリ全体 http://msdn.microsoft.com/en-us/library/bb383977.aspx

+0

ここで拡張メソッドがどのように役立つかを詳しく説明できますか?私は彼らがOPに必要な拡張ポイントの種類を手助けするとは思わない。 – CodesInChaos

+1

あなたは正しいです。この回答は、部分集合全体にわたるアセンブリの代替品にすぎません。イベントは元の問題の最良の方法です。 – r03

0

部分的なクラスがサポートされていません。特定の名前空間の下のクラス。
これは、開発者がコンパイル後にビルドする1つのアセンブリ内で、コードを1つのクラスに同期させるために行われました。ブライアン・メインズが提案されているよう

var catalog = new DirectoryCatalog("bin"); 
var container = new CompositionContainer(catalog); 
container.ComposeParts(); 

var plugins = container.GetExportedValues<IPlugin>(); 
foreach (IPlugin plugin in plugins) 
{ 
    plugin.OnCreating(); 
} 

やイベントとのインタフェースを作成します:その後、

public interface IPlugin 
{ 
    event OnCreatingEventHandler OnCreating; 
} 

あなたはおそらくインターフェイスからメソッドを実行するには、次のような何かを行うことができ、あなたのMEF質問について

関連する問題