CompositionOptions.DisableSilentRejection 不工作

CompositionOptions.DisableSilentRejection not working

我无法弄清楚 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);
 }

上面的代码将打印一个合成异常,因为 TypeCatalog 中缺少 Foo3。这就是我所期望的。

但是,错误消息仍然抱怨缺少 Foo1 导出,而不是提供有关 Foo2-Foo3 依赖项的明确错误。这不是 DisableSilentRejection 应该解决的问题吗?我错过了什么?

事实证明 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>();
}

(在我的实际用例中,我需要优先考虑来自一个出口供应商的出口,这就是我采用更复杂路线的原因。)