public override void InstallBindings()
        {
            // logging
            Container.Bind(typeof(ILogger <>)).FromMethodUntyped(CreateLogger).AsTransient().When(ShouldCreateLogger);

            // settings
            Container.BindInterfacesAndSelfTo <SettingsManager>().AsSingle();
            Container.Bind <Settings>().FromMethod((context) => context.Container.Resolve <SettingsManager>().settings);
            Container.BindInterfacesAndSelfTo <CalibrationData>().AsSingle();

            if (XRSettings.loadedDeviceName.Equals("openvr", StringComparison.InvariantCultureIgnoreCase) &&
                OpenVR.IsRuntimeInstalled() &&
                !Environment.GetCommandLineArgs().Contains("--force-xr"))
            {
                Container.Bind <OpenVRFacade>().AsTransient();
                Container.BindInterfacesAndSelfTo <OpenVRDeviceProvider>().AsSingle();
            }
            else
            {
                Container.BindInterfacesTo <UnityXRDeviceProvider>().AsSingle();
            }

            // managers
            Container.BindInterfacesAndSelfTo <PlayerAvatarManager>().AsSingle().NonLazy();
            Container.BindInterfacesAndSelfTo <ShaderLoader>().AsSingle().NonLazy();
            Container.BindInterfacesAndSelfTo <DeviceManager>().AsSingle().NonLazy();

            // this prevents a race condition when registering components in AvatarSpawner
            Container.BindExecutionOrder <PlayerAvatarManager>(kPlayerAvatarManagerExecutionOrder);

            Container.Bind <AvatarLoader>().AsSingle();
            Container.Bind <AvatarSpawner>().AsSingle();
            Container.BindInterfacesAndSelfTo <VRPlayerInput>().AsSingle();
            Container.Bind(typeof(VRPlayerInputInternal), typeof(IInitializable), typeof(IDisposable)).To <VRPlayerInputInternal>().AsSingle();
            Container.BindInterfacesAndSelfTo <LightingQualityController>().AsSingle();
            Container.BindInterfacesAndSelfTo <BeatSaberUtilities>().AsSingle();

            #pragma warning disable CS0612
            Container.BindInterfacesAndSelfTo <FloorController>().AsSingle();
            #pragma warning restore CS0612

            // helper classes
            Container.Bind <MirrorHelper>().AsTransient();
            Container.Bind <IKHelper>().AsTransient();
            Container.Bind <TrackingHelper>().AsTransient();

            Container.Bind <MainSettingsModelSO>().FromInstance(_pcAppInit.GetField <MainSettingsModelSO, PCAppInit>("_mainSettingsModel")).IfNotBound();
        }
        public override void InstallBindings()
        {
            // logging
            Container.Bind <ILoggerProvider>().To <IPALoggerProvider>().AsTransient().WithArguments(new object[] { _logger });

            // settings
            Container.BindInterfacesAndSelfTo <SettingsManager>().AsSingle();
            Container.Bind <Settings>().FromMethod((context) => context.Container.Resolve <SettingsManager>().settings);
            Container.BindInterfacesAndSelfTo <CalibrationData>().AsSingle();

            if (XRSettings.loadedDeviceName.Equals("openvr", StringComparison.InvariantCultureIgnoreCase) &&
                OpenVR.IsRuntimeInstalled() &&
                !Environment.GetCommandLineArgs().Contains("--force-xr"))
            {
                Container.Bind <OpenVRFacade>().AsTransient();
                Container.BindInterfacesAndSelfTo <OpenVRDeviceProvider>().AsSingle();
            }
            else
            {
                Container.BindInterfacesTo <UnityXRDeviceProvider>().AsSingle();
            }

            // managers
            Container.BindInterfacesAndSelfTo <PlayerAvatarManager>().AsSingle().NonLazy();
            Container.BindInterfacesAndSelfTo <CamerasController>().AsSingle().NonLazy();
            Container.BindInterfacesAndSelfTo <ShaderLoader>().AsSingle().NonLazy();
            Container.BindInterfacesAndSelfTo <DeviceManager>().AsSingle().NonLazy();

            Container.Bind <AvatarLoader>().AsSingle();
            Container.BindInterfacesAndSelfTo <VRPlayerInput>().AsSingle();
            Container.BindInterfacesAndSelfTo <FloorController>().AsSingle();
            Container.BindInterfacesAndSelfTo <LightingQualityController>().AsSingle();
            Container.BindInterfacesAndSelfTo <BeatSaberUtilities>().AsSingle();

            // helper classes
            Container.Bind <MirrorHelper>().AsTransient();
            Container.Bind <AvatarSpawner>().AsTransient();
            Container.Bind <IKHelper>().AsTransient();
            Container.Bind <TrackingHelper>().AsTransient();

            Container.Bind <MainSettingsModelSO>().FromInstance(_pcAppInit.GetField <MainSettingsModelSO, PCAppInit>("_mainSettingsModel")).IfNotBound();
        }