c# - Autofac : ComponentNotRegisteredException after web site restart

标签 c# autofac nopcommerce

我有一个奇怪的错误。在我将 DLL 上传到 bin 文件夹后,我的网站可以正常工作。

但是在我离开一段时间后(或从我的共享主机控制面板触发网站重启)

出现以下错误

The requested service 'Nop.Core.Data.DataSettings' has not been registered. To avoid  this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.


[ComponentNotRegisteredException: The requested service 'Nop.Core.Data.DataSettings'  has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.]
   Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) +231
   Autofac.ResolutionExtensions.Resolve(IComponentContext context, IEnumerable`1 parameters) +118
   Autofac.ResolutionExtensions.Resolve(IComponentContext context) +75
   Nop.Core.Infrastructure.DependencyManagement.ContainerManager.Resolve(String key) +156
   Nop.Core.Infrastructure.NopEngine.Resolve() +110
   Nop.Data.EfStartUpTask.Execute() +94
   Nop.Core.Infrastructure.NopEngine.RunStartupTasks() +806
   Nop.Core.Infrastructure.NopEngine.Initialize(NopConfig config) +90
   Nop.Web.MvcApplication.Application_Start() +494[/i]

有人知道如何解决这个问题吗?

谢谢

最佳答案

看起来应用重启导致某些东西想要解析未注册的类型。堆栈跟踪显示某种启动任务正在运行,并且该任务正在尝试解析类型 Nop.Core.Data.DataSettings

首先,尝试找到 Nop.Core.Data.DataSettings 类型在 Autofac 中注册的位置。您应该会在代码的某处看到一行看起来像像...

builder.RegisterType<DataSettings>();

也就是说,DataSettings 类型应该在 Autofac.ContainerBuilder 中注册。如果该行在任何地方都不存在,则需要添加它以便注册该类型。 Autofac 不只是“自动”解析未注册的类型。 (或者,您可以使用 Autofac 注册 AnyConcreteTypeNotAlreadyRegisteredSource,但这通常是矫枉过正。)

如果找不到该行,则需要添加它。位置取决于您的应用程序,但您应该会看到其他一些地方正在向 Autofac 注册 - 这可能也是放置它的好地方。

如果 DataSettings 已经注册,那么这意味着您的应用程序重启并不总是以相同的顺序执行启动操作,或者甚至可能不执行始终相同的启动操作。如果您的代码在应用程序启动时运行(例如在 HttpModule 中),但未正确处理多个工作进程或未正确处理线程,则可能会发生这种情况。

另一种可能(但不太可能)的情况是,您的应用程序中运行了两个 Autofac 容器,而 DataSettings 在其中一个中,但不在另一个中。这确实是边缘案例,但它是可能的。

接下来,查看堆栈跟踪中的所有代码。找出试图解析 DataSettings 对象的内容。它可能不会直接得到解决;它可能是构造函数依赖于其他正在解决的问题。您将不得不深入研究代码才能弄明白。

无论如何,这看起来像是应用程序启动问题,而不是 Autofac 问题。 Autofac 不只是“丢失”注册 - 如果它提示您正在尝试解决未注册的问题......那么它就没有注册。

异常消息告诉您调试它需要知道的一切 - 解决发生的位置,它正在寻找什么...您需要破解您的应用程序代码,查看堆栈跟踪中显示的实际执行路径,并查看已解决的问题、时间和原因,以便您找出修复方法。

关于c# - Autofac : ComponentNotRegisteredException after web site restart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15740726/

相关文章:

c# - Autofac.Extras.DynamicProxy2 v3.0.6 出现异常

c# - 让类返回一个字段

c# - String.Normalize equvilent 在 Windows Phone 上用于 Unicode 组合

c# - 如何使用选定的特定文件打开资源管理器?

c# - 在脚本中更改 Cinemachine 的摄像机距离

nopcommerce - 将数量部分添加到 nopcommerce2.2 中的 View /目录中的 _ProductBox.cshtml

automapper - Autofac 3 和 Automapper

c# - 如何在 Autofac 中从单点操作注册

html - 将页脚放在底部并在不重新对齐 HTML 的情况下将其扩展到全屏

performance - 在 Nopcommerce 上构建的电子商务网站在多个主机名上从 CDN 加载图像的挑战