4

我有一个奇怪的错误。在我将 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]

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

谢谢

4

2 回答 2

7

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

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

builder.RegisterType<DataSettings>();

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

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

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

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

接下来,查看堆栈跟踪中的所有代码。弄清楚是什么试图解析DataSettings对象。它可能无法直接解决;它可能是构造函数对正在解决的其他问题的依赖。您将不得不深入研究代码才能弄清楚。

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

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

于 2013-04-01T15:48:59.573 回答
4

听起来您需要加载程序集,BuildManager.GetReferencedAssemblies()以确保在回收 AppDomain 后加载它们。

我在过去发布了类似问题的详细信息:

Autofac 在 Web.Config 上丢失注册编辑

我将在 Autofac wiki 上添加一些关于此的注释。

于 2013-04-02T04:20:10.653 回答