Intermittent LifetimeScope error: SelfRegistrationCannotBeActivated

Intermittent LifetimeScope error: SelfRegistrationCannotBeActivated

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

我有点无能为力,因为异常有点神秘 - 几层嵌套的 DependencyResolutionException 和 InvalidOperationException,底部有以下消息: "The container's self-registration of context interfaces should never be activated as it is hard-wired into the LifetimeScope class. "

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

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

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

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

  • 这会花很多时间。
  • 破译你发现的内容会非常混乱和困难。
  • 最终这并不重要,因为解决方案将非常小心地处理锁、多线程和范围 creation/disposal。

举例来说,Autofac 有一段时间有一个很长的 运行 问题,其中处理父生命周期作用域 不会 处理从中产生的任何子作用域那个家长我们为它修复了很长时间,但事实证明,通过这种方式跟踪范围的层次结构,它很容易在高流量中引入内存泄漏,例如每个请求都有生命周期范围的网站。最终结果是 wontfix,因为如果你正在旋转生命周期范围,你也应该对拆除它们负起责任。

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