System.Core.dll中发生了未处理的“System.StackOverflowException”类型exception

在我的Asp.net MVC项目中

我有一个初始化统一容器的bootsrapper。

我不知道为什么,但我明白了

System.Core.dll中发生了未处理的“System.StackOverflowException”类型exception

我已经加倍检查,只在我的初始化程序中完成注册。

所有依赖项仅在ctors中注入。

有什么可能导致这个?

protected void 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);之后失败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(); container.RegisterType(); container.RegisterType(); #endregion #region Dals container.RegisterType<IDal, AppsDal>(); #endregion Dals #region cache container.RegisterType<ICache, GroupsCache>(new ContainerControlledLifetimeManager()); container.RegisterType<ICache, AppsCache>(new ContainerControlledLifetimeManager()); container.RegisterType<ICache, SettingsServiceDataCache>(new ContainerControlledLifetimeManager()); #endregion cache #region Pollers container.RegisterType<IPoller, GroupsPoller>(new ContainerControlledLifetimeManager()); container.RegisterType<IPoller, AppsPoller>(new ContainerControlledLifetimeManager()); container.RegisterType<IPoller, SettingsPoller>(new ContainerControlledLifetimeManager()); #endregion Pollers container.RegisterType(new ContainerControlledLifetimeManager()); container.RegisterType(); if (!isInitialize) { isInitialize = true; } } } } 

没有提供代码,我想这是由于循环依赖。 另一个可能的原因是你的一个构造函数中有一个不正确的循环。

例如,A类需要解析B的实例; B类需要解析C类的实例,C类需要解析A的实例。 这导致无限循环:

 public class A { public A(B b) { } } public class B { public B(C c) { } } public class C { public C(A a) { } } 

正如Rafael所提到的,这通常是由循环依赖引起的,但是如果你需要这些依赖关系,你可以通过手动解决其中的一些来修复它。

例如:

 // Register the UnityContainer with itself container.RegisterInstance(container); public class A { public A(B b) {} } public class B { public B(C c) {} } public class C { private readonly IUnityContainer _container; private A _a => _container.Resolve(); public C(IUnityContainer container) { _container = container; } } 

这意味着可以构建C而无需了解A,直到使用它为止:)