我有一個包含AssemblyCatalog和DirectoryCatalog的AggregateCatalog。如何優先處理MEF中的不同目錄?
我希望他們這樣的工作:
- 如果這兩個目錄可以找到一個出口,然後從DirectoryCatalog之一。
- 如果他們都不能找到導出,那麼只需將導入保留爲空即可。
- 如果其中只有一個可以找到導出,那麼只需使用該導出來填充導入即可。
我該如何做到這樣?
我有一個包含AssemblyCatalog和DirectoryCatalog的AggregateCatalog。如何優先處理MEF中的不同目錄?
我希望他們這樣的工作:
我該如何做到這樣?
您可以通過將目錄中不同的出口供應商,然後通過出口供應商的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]
。
謝謝,它的工作原理。順便說一下, – CuiPengFei 2012-03-02 20:44:26
,這是記錄? – CuiPengFei 2012-03-02 21:02:19
@崔鵬飛:我不確定我在哪裏撿到了。也許通過閱讀[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
查看[使用MEF替換組件](http://greenicicleblog.com/2010/07/19/replacing-components-with-mef/)他們討論瞭如何改變MEF,以便優先處理導出 – Terkel 2012-03-01 16:42:07
@Simon Bang Terkildsen謝謝,我已經看過這個博客。但它需要一個定製的目錄和屬性,而我正在尋找一個更簡單的方法。 – CuiPengFei 2012-03-01 16:48:27