C# Unity将异常包装为ResolutionFailedException。如何避免?

C# Unity将异常包装为ResolutionFailedException。如何避免?,c#,inversion-of-control,unity-container,C#,Inversion Of Control,Unity Container,我想知道,有没有可能问Unity“在解析时不要包装任何用户异常” 真的,为什么统一包装解决方案失败了?它正在改变“构建服务合同”,即使用unity初始化对象的事实应该是透明的,这意味着如果客户机等待“new”操作符的IOException,它也应该将其展开,即使对象是使用unity创建的 其他IoC容器的行为是否相同?签出ResolutionFailedException.InnerException 正在更改“施工服务合同” 什么合同 使用unity初始化对象的事实应该是透明的 IoC容器的一

我想知道,有没有可能问Unity“在解析时不要包装任何用户异常”

真的,为什么统一包装解决方案失败了?它正在改变“构建服务合同”,即使用unity初始化对象的事实应该是透明的,这意味着如果客户机等待“new”操作符的IOException,它也应该将其展开,即使对象是使用unity创建的


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

签出
ResolutionFailedException.InnerException

正在更改“施工服务合同”

什么合同

使用unity初始化对象的事实应该是透明的

IoC容器的一个要点是减少对对象构造的关注,以便开发人员能够专注于增加业务价值

这意味着,若客户机等待来自“new”操作符的IOException,那个么即使对象是使用Unity创建的,它也应该将其展开

哇,哪个客户端正在使用期望
IOException
的容器?我认为您可能误用了IoC容器。

因为您的

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


但是,如果您让构造函数保持简单,您就不会有这个问题。

Unity wraps例外的原因都与契约有关——解析方法的契约

当Resolve抛出时,应用程序应该捕获什么?假设您确实解析了一个引发IOException的类。因此,您在resolve调用周围放置了一个异常捕获

然后,实现发生了变化。或者只是配置。现在,服务部门抛出了其他东西

现在,您有了一个需要更改代码的配置更改。不太好


第二个原因是,在包装异常的情况下,容器可以放置诊断信息,说明故障发生在解决过程的何处。

我也有类似的需要,并在这里找到了解决方案:

下面是我在回顾链接文章的答案时学到的:

  • 如果您只想捕获异常并记录它们,那么添加一个IEExceptionLogger
  • 如果要捕获异常并操纵响应,请替换IEExceptionHandler
  • 这两种解决方案都不能捕获所有异常。我仍在使用Application\u Error捕获ApicController方法中未捕获的异常

我想继续为我的客户使用Unity透明。“一点IoC容器..商业价值..”我问的是具体的Unity功能。对不起,我讨厌这些“商业价值”洗脑。@Roman Pokrovskij:不,这里没有商业价值洗脑。你发表了一份声明;我不同意。您的声明是,使用Unity的对象构造应该是透明的。IoC容器的全部要点是为您处理对象构造(以及其他事项)。我们之所以使用IoC容器为我们处理对象构造,是因为这是一个无聊的问题,花时间解决它并不能为我们的利益相关者增加价值。您可以将代码中的字符数转换为焦耳和$$。构造函数不应包含逻辑,但在许多情况下它们都包含逻辑:/假设我们有一个只在整个实例生命周期中调用的方法,这个函数/测试必须在使用其他方法(如自定义身份验证)之前完成。很自然地将此测试交给构造函数。还有其他变体(首先生成代理,并与“GetIntance”一起进行身份验证;或者在每次调用时测试isAuthenticated标志,如果为false,则进行身份验证并设置为true),但我不能同意这些算法更好的观点。谢谢你的文章。@Roman Pokrovksij:这样做很自然,但这并不意味着它是正确的。该责任应委托到其他地方,而不是在对象构造函数中。已同意。安全性是一个贯穿各领域的问题,最好通过修饰(或拦截)来解决。这里有一个关于缓存的示例,但是身份验证和授权可以用相同的方式处理:我不明白这是如何回答这个问题的。内部有防护装置的构造函数会引发异常。Unity吞下该异常并导致对象变为null,这将被下一个守卫捕获。最后,我们构建的对象似乎是空的,而不是它的一个依赖项。