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

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

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

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

因为你的构造函数应该不包含逻辑 。

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

但是,如果您保持构造函数简单,那么您就不会遇到这个问题。

查看ResolutionFailedException.InnerException

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

什么合同?

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

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

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

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

Unity包含exception的原因是合同 – Resolve方法的合同。

Resolve抛出时应用程序应该捕获什么? 假设你确实解决了一个你知道抛出IOException的类。 所以你在解决调用中围绕该exception设置了一个catch。

然后实施改变。 或者只是配置。 现在这些服务会抛出其他东西。

现在您已经进行了需要更改代码的配置更改。 不好。

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

我有类似的需求,并在此处找到了解决方案: 捕获ASP.NET Web Api中所有未处理的exception

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

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