我有一个简单的控制台应用程序,如下所示(为简单起见,删除了不相关的代码)
[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方法有什么问题?
谢谢
答案 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),并使用“*。*”作为第二个参数。它的工作原理