2011-01-30 11 views
0

漠然とした質問の枠組みに対する謝罪。MEF InheritedExport Hiding?

ここに状況があります。私はAssembly1(クラス図書館)にParentAを持っています。 ParentAタイプのParentA

もう1つの製品チームが、ChildAのParentAの動作の一部をオーバーライドし、Assembly1への参照を保持しているAssembly-Assembly2を展開したいとしています(明らかに)。

必要なのは、ParentAがChildAによって完全に隠され、ParentAをインポートするすべてのコンテナが、代わりにChildAのインスタンスへの参照を取得する必要があるということです。標準継承のもの。

BUT - MEFはParentAとChildAの両方のインスタンスをエクスポートしますか?

この状況を回避するにはどうすればよいですか?

+0

私は混乱しています。あなたの質問の途中で 'ChildA'の名前を' ClassB'に変更しましたか? –

+0

@Wim - それについては申し訳ありません。クラスをより明確に改めました。朝の午前3時に投稿しました –

答えて

2

MEFがClassAの2つのエクスポートを検出したときに、それが1つのみ期待されるときには、カーディナリティの問題があると言うCompositionExceptionがスローされます。両者の選択方法はわかりません。

複数のエクスポートプロバイダをコンテナに渡すと、コンテナはエクスポートを検索するときに順番に各エクスポートプロバイダにクエリを実行します。部品を提供する最初の輸出業者が勝ちます。

次の例では、 "カスタマイズされた"サブフォルダ内のアセンブリによって提供されるエクスポートは、実行可能ファイルのフォルダ内のアセンブリによって提供されるエクスポートを上書きします。

var defaultExportProvider = 
    new CatalogExportProvider(new DirectoryCatalog(".","*")); 
var customizedExportProvider = 
    new CatalogExportProvider(new DirectoryCatalog(@".\customized")); 
var container = new CompositionContainer(
    customizedExportProvider, defaultExportProvider); 
defaultExportProvider.SourceProvider = container; 
customizedExportProvider.SourceProvider = container; 

編集

説明解決策が十分でないので、私はあなたがImportManyではなくImportを使用していることを前提とすることができます。その場合は、まだ両方のエクスポートを取得することになりますので、metadataを追加する必要があります。次に、どのインポートが「ベスト」であるかを決定するコードをインポートクラスに書くことができます。このblog postDaniel Plaistedでご覧ください。

+0

質問を正しく言い表してはいけません。 ParentAのリストをコレクションにインポートできるとしましょう。問題は、モジュールの1つが基本クラスのエクスポートを隠し、継承されたクラスのみをエクスポートしたいということです。それはどのように可能でしょうか? –

3

おそらくこれは、あなたが/あるものですが探していた。

http://msdn.microsoft.com/en-us/library/ee155691.aspx#avoiding_discovery

これは、それがこう言われる、いくつかのケースでは

、あなたが発見されてから一部を防止したい場合がありますカタログの一部として 例えば、部分は継承されるが、使用されないようにすることを意図した基本クラスであってもよい( )。 これを達成するには2つの方法があります。まず、部品クラスにキーワードabstractを使用できます。 抽象クラスはエクスポートを提供することはありませんが、それらから派生したクラスへの継承エクスポートを に提供できます。

クラスを抽象化できない場合は、 PartNotDiscoverable属性を使用してクラスを修飾できます。この属性 で装飾された部分は、カタログには含まれません。次の例の は、これらのパターンを示しています。 DataOneは カタログで発見されます。 DataTwoは抽象であるため、発見されません。 DataThreePartNotDiscoverable属性を使用しているため、 が見つかりませんでした。

<Export()> 
Public Class DataOne 
    'This part will be discovered 
    'as normal by the catalog. 
End Class 

<Export()> 
Public MustInherit Class DataTwo 
    'This part will not be discovered 
    'by the catalog. 
End Class 

<PartNotDiscoverable()> 
<Export()> 
Public Class DataThree 
    'This part will also not be discovered 
    'by the catalog. 
End Class