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>();
}
(在我的实际用例中,我需要优先考虑来自一个出口供应商的出口,这就是我采用更复杂路线的原因。)
我无法弄清楚 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>();
}
(在我的实际用例中,我需要优先考虑来自一个出口供应商的出口,这就是我采用更复杂路线的原因。)