1

我有一个场景,它涉及每个“会话”一个单独的 LifetimeScope 和工作线程中的长时间运行解析。我收到一个不稳定的错误,可能与时间有关 - 它发生在生命周期范围在实际解决方案有机会完成之前被处置/创建时。

我有点不知所措,因为异常有点神秘 - 几层嵌套的 DependencyResolutionException 和 InvalidOperationException 底部有以下消息:“容器的上下文接口的自注册永远不应该被激活,因为它被硬连接到 LifetimeScope班级。 ”

抛出它的 Autofact 代码也没有透露太多 -> https://github.com/autofac/Autofac/blob/d44e09d37863e13aa09eefa6f249caf1e5caf0f1/src/Autofac/Core/Container.cs

这个异常实际上是在什么情况下抛出的?

4

1 回答 1

2

如果您有一个多线程场景,您正在一个单独的线程上进行解析(这是您所描述的),那么您将不得不围绕生命周期范围的创建和处置进行大量锁定。在尝试从该生命周期范围内解决某些问题的同时处理生命周期范围将使您陷入困境。这样做的结果是你会看到没有多大意义的奇怪消息。

实际上,回顾代码以找出解决此错误的所有方法可能会导致以下一个(或多个)结果:

  • 这将需要很多时间。
  • 破译你发现的东西会非常令人困惑和困难。
  • 最终这并不重要,因为解决方案会非常小心地处理锁、多线程和范围创建/处置。

例如,Autofac 有一段时间存在一个长期存在的问题,即处理父生命周期范围不会处理从该父级生成的任何子范围。我们花了很长时间对其进行修复,但结果表明,通过这种方式跟踪范围的层次结构,它很容易在高流量中引入内存泄漏,例如每个请求都有一个生命周期范围的网站。最终的结果是wontfix,如果你正在旋转生命周期范围,你也应该非常负责地拆除它们。

总的来说,解析操作很像构造函数——它们应该非常快速、原子,并且不需要多线程。一旦你不得不产生一个工作线程来执行一个需要很长时间的解析......这更像是一个需要解决的架构问题。

于 2017-09-28T23:12:55.477 回答