2012-03-01 47 views
4

我有一個包含AssemblyCatalog和DirectoryCatalog的AggregateCatalog。如何優先處理MEF中的不同目錄?

我希望他們這樣的工作:

  1. 如果這兩個目錄可以找到一個出口,然後從DirectoryCatalog之一。
  2. 如果他們都不能找到導出,那麼只需將導入保留爲空即可。
  3. 如果其中只有一個可以找到導出,那麼只需使用該導出來填充導入即可。

我該如何做到這樣?

+1

查看[使用MEF替換組件](http://greenicicleblog.com/2010/07/19/replacing-components-with-mef/)他們討論瞭如何改變MEF,以便優先處理導出 – Terkel 2012-03-01 16:42:07

+0

@Simon Bang Terkildsen謝謝,我已經看過這個博客。但它需要一個定製的目錄和屬性,而我正在尋找一個更簡單的方法。 – CuiPengFei 2012-03-01 16:48:27

回答

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點,必須標記各個導入以允許默認值(例如null)與[Import(typeof(SomeType),AllowDefault=true]

+0

謝謝,它的工作原理。順便說一下, – CuiPengFei 2012-03-02 20:44:26

+1

,這是記錄? – CuiPengFei 2012-03-02 21:02:19

+0

@崔鵬飛:我不確定我在哪裏撿到了。也許通過閱讀[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) – 2012-03-02 22:28:27