Autofac:网站重启后的componentnoregisteredexception
本文关键字:componentnoregisteredexception 重启 网站 Autofac | 更新日期: 2023-09-27 18:06:54
我有一个奇怪的错误。我的网站工作后,我上传一个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
。
首先,尝试查找在Autofac中注册Nop.Core.Data.DataSettings
类型的位置。你应该看到,在你的代码的某处,一行看起来像…
builder.RegisterType<DataSettings>();
也就是说,DataSettings
类型应该与Autofac.ContainerBuilder
注册。如果该行在任何地方都不存在,则需要添加该行,以便注册类型。autofacc不只是"自动"解析未注册的类型。(或者,您可以在Autofac中注册AnyConcreteTypeNotAlreadyRegisteredSource
,但这通常是多余的。)
如果您找不到那行,您需要添加它。Where取决于你的应用程序,但你应该看到其他地方的东西正在被autofacc注册-这可能是一个很好的地方放置这个
如果DataSettings
已经注册,那么这意味着你的应用程序重启并不总是以相同的顺序执行启动动作,或者甚至可能不执行相同的启动动作所有的时间。如果你的代码在应用程序启动时运行(比如在HttpModule
中),不能正确处理多个工作进程或不能正确处理线程,就会发生这种情况。
另一种可能(但不太可能)的情况是,您的应用程序中运行了两个Autofac容器,而DataSettings
在其中一个容器中,而不在另一个容器中。这确实是极端情况,但这是可能的。
接下来,查看堆栈跟踪中的所有代码。找出试图解决DataSettings
对象的内容。它可能不会直接得到解决;它可能是一个构造函数依赖于正在被解析的其他东西。你得仔细琢磨代码才能弄明白。
无论如何,这看起来像是一个应用程序启动问题而不是Autofac问题。Autofac不只是"丢失"注册——如果它在抱怨你试图解决一些没有注册的东西……
异常消息告诉你调试它所需要知道的一切——解析在哪里发生,它在寻找什么……你需要打开你的应用程序代码,查看堆栈跟踪中显示的实际执行路径,并查看什么被解决,何时被解决以及为什么被解决,这样你就可以找出如何修复它。
听起来您需要使用BuildManager.GetReferencedAssemblies()
加载程序集,以确保它们在AppDomain回收后加载。
我已经张贴了细节,以回应过去类似的问题:
autoface在Web上丢失注册。配置编辑
我会在Autofac wiki中添加一些注释。