类型的未处理的异常'System.StackOverflowException'发生在System.Core.dll [英] An unhandled exception of type 'System.StackOverflowException' occurred in System.Core.dll
问题描述
在我的Asp.net MVC项目
我有一个初始化单位容器bootsrapper。
我不知道为什么,但我得到
类型'System.StackOverflowException的未处理的异常出现在System.Core.dll
块引用>我已经翻了一番检查并登记在我的初始化只是做了。
所有的依赖关系在构建函数仅注射。
什么可能造成的?
保护无效的Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes); Initializer.Initialize();
BundleConfig.RegisterBundles(BundleTable.Bundles);
}据
BundleConfig.RegisterBundles(BundleTable.Bundles)失败后;
公共静态类初始化
{
私人静态布尔isInitialize;
私人静态只读对象LockObj =新的对象();
私有静态IUnityContainer defaultContainer =新UnityContainer(); 静态初始化()
{
初始化();
} 公共静态无效初始化()
{
如果(isInitialize)
返回; 锁定(LockObj)
{
IUnityContainer容器= defaultContainer; //注册为团结MVC
DependencyResolver.SetResolver(新UnityDependencyResolver(容器)); //注册团结的Web API
// GlobalConfiguration.Configuration.DependencyResolver =新Unity.WebApi.UnityDependencyResolver(容器); #区域经理
container.RegisterType< ISettingsManager,设定管理>(); container.RegisterType< IMamDataManager,MamDataManager>(); container.RegisterType< IAppsDataManager,AppsDataManager>();
#endregion #区域DALS
container.RegisterType<&IDAL LT; ClientService.DAL.EntityFramework.App>中AppsDal>(); #endregion DALS #区域缓存
container.RegisterType&所述; ICACHE&下;串,ClientService.DAL.EntityFramework.Group>中GroupsCache>(新ContainerControlledLifetimeManager()); container.RegisterType&所述; ICACHE&下;串,ClientService.DAL.EntityFramework.App>中AppsCache>(新ContainerControlledLifetimeManager()); container.RegisterType&所述; ICACHE&下;串,SettingsServiceData>中SettingsServiceDataCache>(新ContainerControlledLifetimeManager());
#endregion缓存 #区域轮询器
container.RegisterType&所述; IPoller&下; ClientService.DAL.EntityFramework.Group>中GroupsPoller>(新ContainerControlledLifetimeManager()); container.RegisterType&所述; IPoller&下; ClientService.DAL.EntityFramework.App>中AppsPoller>(新ContainerControlledLifetimeManager()); container.RegisterType&所述; IPoller&下; SettingsServiceData>中SettingsPoller>(新ContainerControlledLifetimeManager()); #endregion轮询器
container.RegisterType&所述; IDefaultConfigurationGroupSingleton,DefaultConfigurationGroupSingleton>(新ContainerControlledLifetimeManager()); container.RegisterType< IApplicationLogger,Log4NetLogger>(); 如果(!isInitialize)
{
isInitialize = TRUE;
}
}
}
}
解决方案如果没有提供code,我想这是由于循环依赖。
另一个可能的原因是,你在你的构造函数中的一个不正确的循环。作为一个例子,一类需要的B的实例,以解决; B级要求C级的实例来加以解决和C类需要一个实例来加以解决。这导致在一个无限循环
大众A级
{
大众A(B B)
{
}
}大众B级
{
大众B(C C)
{
}
}公共C类
{
公众B(A一)
{
}
}In my Asp.net MVC project
I have a bootsrapper that initialize a unity-container.
I don't know why, but I get
An unhandled exception of type 'System.StackOverflowException' occurred in System.Core.dll
I have doubled checked and registration is done only in my initializer.
All dependencies are injected in the ctors only.
What could have caused this?
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); Initializer.Initialize(); BundleConfig.RegisterBundles(BundleTable.Bundles); }
It fails after
BundleConfig.RegisterBundles(BundleTable.Bundles);
public static class Initializer { private static bool isInitialize; private static readonly object LockObj = new object(); private static IUnityContainer defaultContainer = new UnityContainer(); static Initializer() { Initialize(); } public static void Initialize() { if (isInitialize) return; lock (LockObj) { IUnityContainer container = defaultContainer; //registering Unity for MVC DependencyResolver.SetResolver(new UnityDependencyResolver(container)); //registering Unity for web API // GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container); #region managers container.RegisterType<ISettingsManager, SettingsManager>(); container.RegisterType<IMamDataManager, MamDataManager>(); container.RegisterType<IAppsDataManager, AppsDataManager>(); #endregion #region Dals container.RegisterType<IDal<ClientService.DAL.EntityFramework.App>, AppsDal>(); #endregion Dals #region cache container.RegisterType<ICache<string, ClientService.DAL.EntityFramework.Group>, GroupsCache>(new ContainerControlledLifetimeManager()); container.RegisterType<ICache<string, ClientService.DAL.EntityFramework.App>, AppsCache>(new ContainerControlledLifetimeManager()); container.RegisterType<ICache<string, SettingsServiceData>, SettingsServiceDataCache>(new ContainerControlledLifetimeManager()); #endregion cache #region Pollers container.RegisterType<IPoller<ClientService.DAL.EntityFramework.Group>, GroupsPoller>(new ContainerControlledLifetimeManager()); container.RegisterType<IPoller<ClientService.DAL.EntityFramework.App>, AppsPoller>(new ContainerControlledLifetimeManager()); container.RegisterType<IPoller<SettingsServiceData>, SettingsPoller>(new ContainerControlledLifetimeManager()); #endregion Pollers container.RegisterType<IDefaultConfigurationGroupSingleton, DefaultConfigurationGroupSingleton>(new ContainerControlledLifetimeManager()); container.RegisterType<IApplicationLogger, Log4NetLogger>(); if (!isInitialize) { isInitialize = true; } } } }
解决方案Without providing code, I guess this is due to a circular dependency. Another possible reason is that you have an improper loop in one of your constructors.
As an example, A class requires an instance of B to be resolved; B class requires an instance of C class to be resolved and C class needs an instance of A to be resolved. This results in an infinite loop:
public class A { public A(B b) { } } public class B { public B(C c) { } } public class C { public B(A a) { } }
这篇关于类型的未处理的异常'System.StackOverflowException'发生在System.Core.dll的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!