Unity将异常包装到ResolutionFailedException。怎么避免?

时间:2011-08-23 17:58:05

标签: c# inversion-of-control unity-container

我想知道,是否有可能要求Unity“不要在解决时包装任何用户异常”?

真的,为什么Unity会对ResolutionFailedException进行包装?它正在改变“建筑服务合同”,恕我直言,使用统一对象初始化的事实应该是透明的,这意味着如果客户端等待来自“new”操作符的IOException示例,它应该将其解包,甚至对象也是使用Unity创建的。

其他IoC容器的行为是否相同?

4 个答案:

答案 0 :(得分:2)

因为您的constructors should contain no logic

我知道这不是一个完全令人满意的答案,但我不知道你可以在Unity中关闭这种行为 - 我也同意这是一个奇怪的设计决定...

但是,如果你保持你的构造函数简单,你将不会遇到这个问题。

答案 1 :(得分:1)

结帐ResolutionFailedException.InnerException

  

正在改变“建筑服务合同”

什么合同?

  

恕我直言,使用unity进行对象初始化的事实应该是透明的

IoC容器的一个重点是使对象构建不那么重要,因此开发人员可以专注于增加业务价值。

  

这意味着如果客户端等待来自“new”运算符的IOException示例,它应该将其解包,甚至对象也是使用Unity创建的。

哇,客户端正在使用期望IOException的容器?我想你可能会误用你的IoC容器。

答案 2 :(得分:1)

Unity包装异常的原因是合同 - Resolve方法的合同。

当Resolve抛出时,应用程序应该捕获什么?假设你确实解决了一个你知道抛出IOException的类。因此,您可以在解析调用周围找到该异常的捕获。

然后实施改变。或者只是配置。现在这些服务还有别的东西。

现在您的配置更改需要更改代码。不好。

第二个原因是,对于包装异常,容器可以放置有关解决过程中故障发生位置的诊断信息。

答案 3 :(得分:0)

我有类似的需求,并在此处找到了解决方案:catch all unhandled exceptions in ASP.NET Web Api

以下是我在查看链接文章的答案时所学到的内容:

  • 如果您只想捕获异常并记录它们,那么添加一个IExceptionLogger。
  • 如果您想捕获异常并操纵响应,那么替换 IExceptionHandler。
  • 两种解决方案都不会捕获所有异常。我仍在使用Application_Error来捕获我的ApiController方法中没有捕获的异常。