2012-03-01 12 views
4

私は、AssemblyCatalogとDirectoryCatalogを含むAggregateCatalogを持っています。両方のカタログが輸出を見つけることができれば、MEFで異なるカタログの優先順位を決める方法は?

  1. をDirectoryCatalogからいずれかを選択します。

    は、私は彼らがこのように仕事をしたいです。

  2. どちらもエクスポートを検出できない場合は、インポートをnullのままにしてください。
  3. これらのうちの1つだけがエクスポートを見つけることができる場合、そのエクスポートを使用してインポートを満たすだけです。

どうすればこのようにすることができますか?

+1

[コンポーネントをMEFに置き換える](http://greenicicleblog.com/2010/07/19/replacing-components-with-mef/)を参照してください.MEFを変更して輸出の優先順位付けを行う方法について説明しています – Terkel

+0

@Simon Bang Terkildsenありがとう、私はこのブログを見てきました。カスタマイズされたカタログと属性が必要ですが、私はより簡単な方法を探しています。 – CuiPengFei

答えて

7

あなたは別の輸出プロバイダでカタログを入れて、その後、このような優先度の高い順にCompositionContainerコンストラクタに輸出プロバイダを渡すことによって、ポイント1と3を達成することができます

var dirCatalog = new DirectoryCatalog(...); 
var provider1 = new CatalogExportProvider(dirCatalog); 

var assemblyCatalog = new AssemblyCatalog(...); 
var provider2 = new CatalogExportProvider(assemblyCatalog); 

var container = new CompositionContainer(provider1, provider2); 

// link the export providers back to the container, so that they can 
// resolve parts from other export providers 
provider1.SourceProvider = container; 
provider2.SourceProvider = container; 

今、あなたは使用することができます通常はcontainerであり、ディレクトリカタログの最初の部分、アセンブリカタログの2番目の部分を探します。カーディナリティー例外が両方に存在する場合、それらは例外になりません。

ポイント2を達成するには、デフォルト値(null)と[Import(typeof(SomeType),AllowDefault=true]を使用できるように個別のインポートをマークする必要があります。

+0

ありがとう、それは動作します。ところで、 – CuiPengFei

+1

これは文書化されていますか? – CuiPengFei

+0

@CuiPengFei:どこでこれを選んだのか分かりません。おそらく[Glenn Blockのブログ](http://blogs.msdn.com/b/gblock/archive/2009/05/14/customizing-container-behavior-part-2-of-n-defaults.aspx)を読んで元MEFプロダクトマネージャー)または[codeplexのサンプル](http://mef.codeplex.com/wikipage?title=Samples&referringTitle=Documentation) –

関連する問題