使用MEF忽略构造函数异常,而Visual Studio不会在异常处中断

HCL*_*HCL 7 c# dependency-injection mef visual-studio-2015

我想创建一些现有的代码模块(IMyDesiredType)来加载MEF.模块大多有一些构造函数参数,我想用MEF(ImportingConstructor)提供.到目前为止这个工作正常.

现在出现问题是因为有时主机应用程序中的依赖项不可用(它们为空).模块将按惯例抛出ArgumentNullException,我不想改变它.但是我希望MEF忽略这些对象(不包括在对象图中).

 [Export(typeof(IMyDesiredType))]
 class MyModule : IMyDesiredType{
    [ImportingConstructor]
    public MyModule(object aNecessaryDependency){
       if(aNecessaryDependency==null) throw new ArgumentNullException(nameof(aNecessaryDependency))
     }
 }
Run Code Online (Sandbox Code Playgroud)

为了获得这个,我让MEF创建Lazy<IMyDesiredType>实例并逐个初始化它们.

foreach(var myLazy in collectionOfMefExports){
  try{
      myLazy.Value // do something with the value, so the object gets composed
   }catch(CompositionException){
      // Here I get the ArgumentNullException wrapped in a CompositionException
      // and also can work around it. However because of the exception handling
      // is on the first hand in MEF, VS will break always in the throwing 
      // constructor of the module
      continue; // Go to the next module after logging etc.
   }
} 
Run Code Online (Sandbox Code Playgroud)

这里的问题是,我必须从模块的构造函数中捕获CompositionException而不是直接Exception(大部分ArgumentNullException).因此,Visual-Studio会在每个模块上中断,因为Exception不会从用户代码中获取.对此明显的解决方案是告诉视觉工作室不要破坏ArgumentNullException类型,但这对我来说非常"苛刻".在任何其他地方,我希望VS能够突破ArgumentNullException.

是否有另一种模式,我可以使MEF不向图形添加组件,其中依赖项是声明([Export]),但它的值是null,或者是否有一个MEF类的方法,我可以在派生类中重写它在前手抓住构造函数异常?

请留下评论,如果问题不明确,我不是英语母语人士,因此问题可能是一个令人困惑的问题.

gre*_*k40 1

不幸的是,对您所要求的支持在某种程度上是有限的。

Visual Studio 允许按异常类型配置调试器是否应中断。当您尝试根据执行上下文显示/隐藏相同类型的异常时,这并没有真正的帮助。您仍然可以派生自己的异常类型并在导入构造函数中使用它。这将允许您按异常类型配置中断,但不会在 MEF 组合和其他代码之间产生差异。

此外,可以将方法标记为被调试器忽略。请参阅此相关答案Don't stop debugger at THAT exception when it's throwing and catch

[DebuggerStepThrough]由于据报道不可靠,因此忽略第一个选项[DebuggerHidden]。我想添加另一个候选人:[DebuggerNonUserCode]。这与 VS 选项“仅启用我的代码”有关(请参阅http://blog.functionfun.net/2008/05/debuggernonusercode-suppressing.html)。

因此, while[DebuggerHidden]永远不会因构造函数中抛出的异常而中断,而是会在下一个周围的用户代码中报告它,[DebuggerNonUserCode]允许您根据 VS 调试设置忽略或中断构造函数。只要设置了“仅启用我的代码”,两个属性的行为方式就应该相同。

假设 MEF 初始化完全在调试器隐藏代码中处理,对于非 MEF 构造函数调用,调试器将在首次到达未标记为隐藏的周围函数时中断。