2013-04-01 56 views
4

我有一个奇怪的错误。在将DLL上传到bin文件夹后,我的网站正常工作。Autofac:重新启动网站后的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. 


[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] 

任何人有怎样就怎样的任何想法解决这个问题?

感谢

+0

另外我使用nopcommerce 2.8 http://www.nopcommerce.com –

回答

4

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

我在响应公布细节,在过去的一个类似的问题:

Autofac Losing Registrations on Web.Config Edit

我将一些笔记添加到Autofac维基这个问题。

6

它看起来像应用程序重启是造成东西要解决未注册的类型。堆栈跟踪显示某种启动任务正在运行,并且该任务试图解析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不只是“失去”注册 - 如果它抱怨你正在尝试解决未注册的内容......那么它不会被注册。

异常消息告诉你一切你需要知道调试它 - 在哪里发生分辨率,它在找什么......你需要破解你的应用程序代码,查看堆栈跟踪中显示的实际执行路径,看看什么时候解决,何时以及为什么你可以找出解决方法。

+0

感谢您的回应! –

相关问题