MEF和AssemblyCatalog / AggregateCatalog

时间:2012-02-19 19:30:36

标签: visual-studio-2010 mef aggregate

我有一个简单的控制台应用程序,如下所示(为简单起见,删除了不相关的代码)

    [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); 

如果通过第1-2行初始化目录,则没有任何内容被加载到_logger中 如果目录在第3行初始化,则两个记录器都被加载到_logger

AggregateCatalog方法有什么问题?

谢谢

2 个答案:

答案 0 :(得分:0)

它应该按照你使用它的方式工作。

但是,在第2行,您将创建DirectoryCatalog,在第3行创建AssemblyCatalog。如果将第二行更改为

,它是否按预期工作
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));

答案 1 :(得分:0)

我发现了问题。

默认情况下,DirectoryCatalog(path)似乎只在DLL中搜索,而我的测试程序是一个控制台应用程序。并且导出是在EXE(而不是DLL)中,所以它们没有被加载。

另一方面,AssemblyCatalog(Assembly.GetExecutingAssembly())显然从当前程序集(即EXE)加载了导出。

解决方案是使用DirectoryCatalog的其他构造函数(path,searchPattern),并使用“*。*”作为第二个参数。它的工作原理