Autofac:网站重启后的ComponentNotRegisteredException

Chr*_*elt 4 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]
Run Code Online (Sandbox Code Playgroud)

任何人都知道如何解决这个问题?

谢谢

Tra*_*lig 7

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

首先,尝试找到Nop.Core.Data.DataSettingsAutofac注册类型的位置.您应该在代码中的某处看到类似于......的行.

builder.RegisterType<DataSettings>();
Run Code Online (Sandbox Code Playgroud)

也就是说,该DataSettings类型应该注册一个Autofac.ContainerBuilder.如果该行在任何地方都不存在,则需要添加该行以便注册该类型.Autofac不仅"自动"解析未注册的类型.(或者,你可以注册AnyConcreteTypeNotAlreadyRegisteredSourceAutofac,但这通常是矫枉过正.)

如果找不到该行,则需要添加该行.哪里取决于你的应用程序,但你应该看到一些其他地方的事情已经注册Autofac - 这也可能是一个很好的地方,这也是.

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

另一个潜在的(但不太可能)情况是你的应用程序中运行了两个Autofac容器,而DataSettings在其中一个容器中,它不在另一个容器中.这是真正的边缘情况,但它是可能的.

接下来,查看堆栈跟踪中的所有代码.找出试图解决DataSettings对象的内容.它可能无法直接解决; 它可能是一个构造函数依赖于其他已经解决的东西.你将不得不插入代码来解决它.

在任何情况下,这看起来像一个应用程序启动问题而不是Autofac问题.Autofac不只是"失去"注册 - 如果它抱怨你正试图解决一些未注册的东西......那么它就没有注册.

异常消息告诉您调试它需要知道的一切 - 分辨率正在发生的地方,它正在寻找什么......您需要破解应用程序代码,查看堆栈跟踪中显示的实际执行路径,以及看看有什么问题得到解决,何时以及为什么这样你就可以弄明白如何解决它.