2012-02-19 38 views
1

我有一個簡單的控制檯應用程序如以下的(未相關的代碼爲簡單起見移除)MEF和AssemblyCatalog/AggregateCatalog

[ImportMany(typeof(ILogger))] 
    public IEnumerable<ILogger> _loggers {get;set;} 

    public interface ILogger 
    { 
     void Write(string message); 
    } 

    [Export(typeof(ILogger))] 
    public class ConsoleLogger : ILogger 
    { 
     public void Write(string message) 
     { 
      Console.WriteLine(message); 
     } 
    } 

    [Export(typeof(ILogger))] 
    public class DebugLogger : ILogger 
    { 
     public void Write(string message) 
     { 
      Debug.Print(message); 
     } 
    } 

的代碼初始化目錄低於

(1) var catalog = new AggregateCatalog(); 
(2) catalog.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
(3) //var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 

var container = new CompositionContainer(catalog); 
var batch = new CompositionBatch(); 
batch.AddPart(this); 
container.Compose(batch); 

如果目錄如果目錄是通過第3行初始化的,兩個記錄器都被加載到_logger中

什麼是「 AggregateCatalog方法的問題是什麼?

謝謝

回答

0

我發現問題。

看來DirectoryCatalog(路徑)默認只在DLL中搜索,而我的測試程序是一個控制檯應用程序。出口是在EXE(不是DLL),所以他們沒有加載。另一方面,AssemblyCatalog(Assembly.GetExecutingAssembly())明顯加載了當前程序集(這是EXE)的導出。

解決方法是使用DirectoryCatalog(path,searchPattern)的其他構造函數,並使用「*。*」作爲第二個參數。它的工作原理

0

它應該按照您使用它的方式工作。

但是,在第2行中,您將創建一個DirectoryCatalog,並在第3行中創建一個AssemblyCatalog。如果您將第二行更改爲

catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
+0

謝謝。但我期望線DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)添加到應用程序的bin文件夾中的所有DLL的目錄導出(這是我真正想要的某個點)。與AssemblyCatalog不同,它只是增加當前Assembly的輸出。如何查找所有DLL中的導出? – bzamfir 2012-02-19 20:04:28