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类的方法,我可以在派生类中重写它在前手抓住构造函数异常?
请留下评论,如果问题不明确,我不是英语母语人士,因此问题可能是一个令人困惑的问题.
不幸的是,对您所要求的支持在某种程度上是有限的。
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 构造函数调用,调试器将在首次到达未标记为隐藏的周围函数时中断。