MEF提供的基於特性的程式設計模型,可以動態的根據目錄找出程式集裡面的所有程式部件。 對於MEF的目錄服務MEF分別為WPF和Silverlight提供了不同的目錄機制。使用目錄的主要功能就是方便實現程式部件的裝載,以及動態的組合應用程式部件等功能,更可以非常方便的得到程式部件的程式集、匯出部件等相關資料。
 
  如下程式碼塊演示瞭如何在Silverlight中獲取到當前應用程式的目錄資訊,包括了程式集和程式部件等。
var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
var assembly 
= catalog.Assembly;
var parts 
= catalog.Parts;
 
  在WPF中可以使用DirectoryCatalog裝配基於目錄的程式部件,Silverlight中則使用DeploymentCatalog來實現目錄的管理,包括程式集下載、裝配等。下面以MEF的目錄在Silverlight中的具體應用為例介紹目錄比較通用的用法,既動態下載與裝配。為了提供系統的靈活性,可以通過抽象介面以高層次的抽象而存在,那麼可以通過如下介面來封裝目錄(DeploymentCatalog)。
public interface IDeploymentService
{
    
void AddXap(string relativeUri, Action<AsyncCompletedEventArgs> completedAction);
}
 
  在具體實現中就可以對DeploymentCatalog進行深度封裝,以達到靈活應用的目的。並且可以將具體的實現通過[Export]標記為可裝配的程式部件,在需要的地方就可以通過介面式的匯入[Import]使用了。
[Export(typeof(IDeploymentService))]
public class DeploymentCatalogService : IDeploymentService
{
    
private static AggregateCatalog _aggregateCatalog;

    Dictionary

<string, DeploymentCatalog> _catalogs;

    

public DeploymentCatalogService()
    {
        _catalogs 
= new Dictionary<string, DeploymentCatalog>();
    }

    

public static void Initialize()
    {
        _aggregateCatalog 
= new AggregateCatalog();
        _aggregateCatalog.Catalogs.Add(
new DeploymentCatalog());
        CompositionHost.Initialize(_aggregateCatalog);
    }

    

public void AddXap(string relativeUri, Action<AsyncCompletedEventArgs> completedAction)
    {
        DeploymentCatalog catalog;
        
if (!_catalogs.TryGetValue(relativeUri, out catalog))
        {
            catalog 
= new DeploymentCatalog(relativeUri);

            

if (completedAction != null)
                catalog.DownloadCompleted 
+= (s, e) => completedAction(e);
            
else
                catalog.DownloadCompleted 
+= DownloadCompleted;

            catalog.DownloadAsync();
            _catalogs[relativeUri] 

= catalog;
            _aggregateCatalog.Catalogs.Add(catalog);

        }
    }

    

void DownloadCompleted(object sender, AsyncCompletedEventArgs e)
    {
        
if (e.Error != null)
        {
            
throw new InvalidOperationException(e.Error.Message, e.Error);
        }
    }
}
 
   有了上面的封裝,下面只需要一句程式碼就可以完成獨立程式包(.xap)的下載和動態裝配,下面為呼叫封裝的目錄服務介面示例:
private void button1_Click(object sender, System.Windows.RoutedEventArgs e)
{
    
this.Service.AddXap(MEFTraining.MefCatalogs.Parts.xapnull);
}
 
  對於具體如何使用和集中控制,可以通過契約介面和後設資料等策略來實現,詳細在後面的文章裡介紹,本篇就介紹到此。
  
  本篇參考於:Using CatalogsDeploymentCatalog
  MEF官方網站:http://mef.codeplex.com/