CompositionOptions.DisableSilentRejection不起作用

时间:2016-03-07 16:40:58

标签: .net mef

我无法弄清楚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应该修复的吗?我错过了什么?

1 个答案:

答案 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>();
}

(在我的实际使用案例中,我需要优先考虑一个出口提供商的出口优先于另一个出口提供商,这就是为什么我采用更复杂的路线。)