间歇性LifetimeScope错误:SelfRegistrationCannotBeActivated

时间:2017-09-28 10:16:45

标签: c# exception autofac dependency-resolver

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

我有点无能为力,因为异常有点神秘 - 几层嵌套的DependencyResolutionException和InvalidOperationException,底部有以下消息: "容器的上下文接口的自注册永远不应该被激活,因为它被硬连线到LifetimeScope类中。 "

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

在什么条件下实际抛出此异常?

1 个答案:

答案 0 :(得分:2)

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

实际上,通过代码查看可以解决此错误的所有方法可能会导致这些结果中的一个(或多个):

  • 这需要花费很多时间。
  • 解读你所发现的东西真是令人困惑和困难。
  • 最终并不重要,因为解决方案在锁,多线程和范围创建/处理方面会非常小心。

举例来说,Autofac在一段时间内有一个长期运行的问题,其中处理父生命周期范围处理从该父级生成的任何子范围。我们已经为它做了很长一段时间的修复,但事实证明,通过跟踪范围的层次结构,它很容易在高流量中引入内存泄漏,例如每个请求有一个生命周期范围的网站。最终结果是wontfix,因为如果你正在改变生命范围,那么你也应该对撕毁它们负责。

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