我无法弄清楚MEF DisableSilentRejection选项的作用。我想到使用此选项可以提高组合错误的清晰度,尤其是在依赖项缺少所请求对象以下几个级别的情况下。但是,它似乎对错误消息没有任何影响。
我正在使用此测试用例来调查MEF如何报告错误。我有一个依赖链Foo1 - > Foo2 - > Foo3:
[Export]
public class Foo1
{
[ImportingConstructor]
public Foo1(Foo2 foo2)
{
}
}
[Export]
public class Foo2
{
[ImportingConstructor]
public Foo2(Foo3 foo3)
{
}
}
[Export]
public class Foo3
{
}
此代码从MEF容器请求Foo1对象:
try
{
using (var exportProvider = new CatalogExportProvider(
new TypeCatalog(typeof(Foo1), typeof(Foo2))))
using (var container = new CompositionContainer(
CompositionOptions.DisableSilentRejection, exportProvider))
{
exportProvider.SourceProvider = container;
container.GetExportedValue<Foo1>();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
}
上面的代码会打印合成异常,因为Foo3
中缺少TypeCatalog
。这就是我的预期。
但是,错误消息仍然抱怨Foo1
导出丢失,而不是提供有关Foo2-Foo3依赖关系的明确错误。这不是DisableSilentRejection应该修复的吗?我错过了什么?
答案 0 :(得分:2)
事实证明ExportProvider
构造函数也需要组合选项:
using (var exportProvider = new CatalogExportProvider(
new TypeCatalog(typeof(Foo1), typeof(Foo2)),
CompositionOptions.DisableSilentRejection)) // Added composition options here!
using (var container = new CompositionContainer(
CompositionOptions.DisableSilentRejection,
exportProvider))
{
exportProvider.SourceProvider = container;
container.GetExportedValue<Foo1>();
}
或者,或者,我可以使用直接获取目录的CompositionContainer
构造函数:
using (var container = new CompositionContainer(
new TypeCatalog(typeof(Foo1), typeof(Foo2)),
CompositionOptions.DisableSilentRejection))
{
container.GetExportedValue<Foo1>();
}
(在我的实际使用案例中,我需要优先考虑一个出口提供商的出口优先于另一个出口提供商,这就是为什么我采用更复杂的路线。)