How to make 2 singleton referense each other

Viewed 51

I working on menu using MVP pattern, so I have 2 singelton presenters. First one is main menu presenter, second is settings menu presenter. First presenter(main menu pres) needs to refernse second (settings pres) and vice versa seconds needs to reference first. Presenters code below:

public class MainMenuPresenter : IPresenter
{
        #region FIELDS
        private IMenuView menuView;
        private IPresenter settingsPresenter;
        #endregion
        
        public MainMenuPresenter(IMenuView menuView, IPresenter settingsPresenter)
        {
            this.menuView = menuView;
            this.settingsPresenter = settingsPresenter;

            Run();
        }
}

public class SettingsMenuPresenter : IPresenter
{
        #region FIELDS
        private ISettingsView settingsView;
        private IPresenter menuPresenter;
        #endregion
        
        public SettingsMenuPresenter(ISettingsView settingsView, IPresenter menuPresenter)
        {
            this.settingsView = settingsView;
            this.menuPresenter = menuPresenter;
        }
}

When I try to inject them using MonoInstaller and code below, unity throws StackOverflow exeption, as I understand, this is due to the fact that zeinject endlessly creates these two presenters. How to make these two singeltons reference each other?

public class MainMenuInstaller : MonoInstaller
{
      public override void InstallBindings()
    {
        Container.Bind<IPresenter>().To<MainMenuPresenter>()
            .WhenInjectedInto(typeof(SettingsMenuPresenter))
            .NonLazy();

        Container.Bind<IPresenter>().To<SettingsMenuPresenter>()
            .WhenInjectedInto(typeof(MainMenuPresenter));

    }
}

1 Answers

You can make your presenters singleton with .AsSingle() while binding.

But you misunderstanding things at here probably, i guess you shouldn't inject any prensenter to any presenter here and any presenter shouldn't be Singleton. A presenter should be created when something has changed at the view and a presenter should be created depends on the callback.

What you could inject could be a Service like SettingsService, InputService etc. You can look at StrangeIoC, it is should be what you want i guess, it is MVC + IoC framework.

Related