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。