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 C(A a)
    {
    }
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With