private void InstallBindingsToSubContainer(DiContainer subContainer)
        {
            subContainer.BindInstance(new InitialState(ShouldRenderInitialValue, InitialValue)).AsCached();
            subContainer.BindInterfacesTo <AsyncNumberRendererUseCase>().AsCached();
            subContainer.BindInterfacesTo <InitializationController>().AsCached();
            switch (RendererType)
            {
            case RendererType.SpriteRenderer:
                subContainer.BindInterfacesTo <AsyncNumberRenderingPresenter <SpriteRenderer, Sprite> >().AsCached();
                subContainer.BindInterfacesTo <AsyncNumberRendererForSpriteRenderer>().FromNewComponentOn(gameObject).AsCached();
                subContainer.Bind <IList <SpriteRenderer> >().FromInstance(Renderers.Select(x => x.GetComponent <SpriteRenderer>()).ToList()).AsCached();
                subContainer.Bind <IList <AssetReferenceT <Sprite> > >().FromInstance(AssetReferenceSprites.OfType <AssetReferenceT <Sprite> >().ToList()).AsCached();
                break;

            case RendererType.UIImage:
                subContainer.BindInterfacesTo <AsyncNumberRenderingPresenter <Image, Sprite> >().AsCached();
                subContainer.BindInterfacesTo <AsyncNumberRendererForUIImage>().FromNewComponentOn(gameObject).AsCached();
                subContainer.Bind <IList <Image> >().FromInstance(Renderers.Select(x => x.GetComponent <Image>()).ToList()).AsCached();
                subContainer.Bind <IList <AssetReferenceT <Sprite> > >().FromInstance(AssetReferenceSprites.OfType <AssetReferenceT <Sprite> >().ToList()).AsCached();
                break;

            case RendererType.UIRawImage:
                subContainer.BindInterfacesTo <AsyncNumberRenderingPresenter <RawImage, Texture> >().AsCached();
                subContainer.BindInterfacesTo <AsyncNumberRendererForUIRawImage>().FromNewComponentOn(gameObject).AsCached();
                subContainer.Bind <IList <RawImage> >().FromInstance(Renderers.Select(x => x.GetComponent <RawImage>()).ToList()).AsCached();
                subContainer.Bind <IList <AssetReferenceT <Texture> > >().FromInstance(AssetReferenceTextures.OfType <AssetReferenceT <Texture> >().ToList()).AsCached();
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            subContainer.BindInstance(EmptyDigitType).AsCached();
            subContainer.BindInstance(ShouldRenderInitialValue).AsCached();
            subContainer.BindInstance(InitialValue).AsCached();
        }
예제 #2
0
 public override void Install(DiContainer container)
 {
     container.Bind <VRMBlendShapeStore>().AsCached();
     container.BindInstance(blendShapeInitializer).AsCached();
     container.BindInstance(lipSyncContext).AsCached();
     container.BindInstance(lipSyncIntegrator).AsCached();
 }
예제 #3
0
        private void InstallPlayerFacade(DiContainer subContainer, CharacterType characterType, Input input)
        {
            subContainer.BindInstance(characterType);
            subContainer.BindInstance(input);

            subContainer.Bind <Grounding>().ToSingle();

            subContainer.Bind <Player>().ToSingle();
            subContainer.BindAllInterfacesToSingle <Player>();

            subContainer.Bind <PlayerController>().ToSingle();
            subContainer.BindAllInterfacesToSingle <PlayerController>();

            subContainer.Bind <PlayerInventory>().ToSingle();
            subContainer.BindAllInterfacesToSingle <PlayerInventory>();

            subContainer.BindSignal <ItemPickupSignal>();
            subContainer.BindTrigger <ItemPickupSignal.Trigger>();

            subContainer.BindSignal <ItemEffectSignal>();
            subContainer.BindTrigger <ItemEffectSignal.Trigger>();

            subContainer.Bind <PlayerStateMachine>().ToSingle();
            subContainer.Bind <PlayerStateFactory>().ToSingle();
        }
예제 #4
0
        /// <summary>
        /// Creates new Character representing the data about the player
        /// </summary>
        /// <returns>The player character's prefab</returns>
        /// <param name="playerData">Player data.</param>
        public GameObject SpawnPlayerCharacter(PlayerData playerData)
        {
            DiContainer    playerContext  = null;
            CharacterState characterState = null;
            GameObject     instance       = null;

            Action MakeNewPlayer = null;

            MakeNewPlayer = () =>
            {
                playerContext  = container.CreateSubContainer();
                characterState = new CharacterState();

                playerContext.DeclareSignal <PlayerKilledSignal>();
                playerContext.BindInstance(characterState);
                playerContext.BindInstance(playerData);

                instance = playerContext.InstantiatePrefab(playerData.character.prefab);

                // HACK: There has to be a better way to do this
                var playerKilledStream = playerContext.Resolve <SignalBus>()
                                         .GetStream <PlayerKilledSignal>();

                // Disabled player control when paused
                gameState.isPaused
                .TakeUntilDestroy(instance)
                .Subscribe(isPaused => characterState.localPlayerControl.Value = !isPaused);

                // Reset the player when killed via recursion
                playerKilledStream
                .First()
                .TakeUntilDestroy(instance)
                .Subscribe(_ =>
                {
                    characterState.localPlayerControl.Value = false;

                    var oldInstance = instance;
                    Observable.Timer(TimeSpan.FromSeconds(3f))
                    .TakeUntilDestroy(oldInstance)
                    .Subscribe(__ =>
                    {
                        characterState.isCorpse.Value = true;
                        /// Keep the body alive for 30 sexonds
                        Observable.Timer(TimeSpan.FromSeconds(30))
                        .TakeUntilDestroy(oldInstance)
                        .Subscribe(___ => GameObject.Destroy(oldInstance));

                        MakeNewPlayer();
                    });
                });
            };

            MakeNewPlayer();

            return(instance);
        }
예제 #5
0
        public void ResolveAllTest()
        {
            var container = new DiContainer();

            container.BindInstance("hoge");
            container.BindInstance("fuga");

            var all = container.ResolveAll <string>();

            Assert.AreEqual(2, all.Count, "配列の数は一致している");
            Assert.AreEqual("hoge", all[0], "配列の一番目の解決が一致");
            Assert.AreEqual("fuga", all[1], "配列の二番目の解決が一致");
        }
예제 #6
0
        public IAvatarBody Create(CreateAvatarBodyArgs args)
        {
            DiContainer subContainer = _container.CreateSubContainer();

            subContainer.BindInstance(args);

            GameObject obj = null;

            switch (args.BodyType)
            {
            case (byte)'A':
                obj = subContainer.InstantiatePrefab(_bodyPrefabA);
                break;

            case (byte)'B':
                obj = subContainer.InstantiatePrefab(_bodyPrefabB);
                break;

            default:
                Debug.LogError($"The passed body type is not found. Received body type is {args.BodyType}");
                break;
            }

            return(obj?.GetComponent <IAvatarBody>());
        }
예제 #7
0
        private SumoBehaviour createSumo(SumoInstaller _sumoPrefab, Sumo _sumoModel)
        {
            DiContainer subcontainer = new DiContainer(m_diContainer);

            subcontainer.BindInstance(_sumoModel).AsSingle();
            return(subcontainer.InstantiatePrefabForComponent <SumoInstaller>(_sumoPrefab).sumoBehaviour);
        }
예제 #8
0
        public void ResolveTest()
        {
            var container = new DiContainer();

            container.BindInstance("hoge");

            Assert.AreEqual("hoge", container.Resolve <string>());
        }
        static void Postfix(DiContainer container)
        {
            container.Bind <IRefreshable>().WithId(refreshableID).To <SongCoreRefreshable>().AsSingle();
            container.Bind(typeof(IInitializable), typeof(IDisposable), typeof(SongCoreLoaderDidLoad)).To <SongCoreLoaderDidLoad>().AsSingle();
            IObservableChange loadEvent = container.Resolve <SongCoreLoaderDidLoad>();

            container.BindInstance(loadEvent).WithId(didLoadEventID).AsSingle();
        }
예제 #10
0
        public void Initialize()
        {
            var loadingScreenView = _loadingScreenViewFactory.Create(
                _sceneManagementConfig.LoadingScreenViewPrefab);

            SetupLoadingScreenView(loadingScreenView);
            _container.BindInstance(loadingScreenView);
        }
예제 #11
0
 private void ExtraBindings(DiContainer diContainer)
 {
     if (diContainer is null)
     {
         return;
     }
     diContainer.BindInstance(point);
 }
예제 #12
0
 public void _10_BindChildAndSelfResolve()
 {
     // 子コンテナのバインドは親コンテナへ影響を与えない
     ChildContainer.BindInstance("child");
     AssertThrows <ZenjectException>(() => SelfContainer.Resolve <string>());
     // -> Unable to resolve 'string'.
     Assert.AreEqual(0, SelfContainer.ResolveAll <string>().Count);
 }
예제 #13
0
        public static void InstallDatabase(DiContainer container, string name = null)
        {
            ConnectionString conString;

            if (string.IsNullOrEmpty(name))
            {
                conString = new ConnectionString(Application.persistentDataPath + "/" + TEST_DATABASE_NAME + ".db");
            }
            else
            {
                conString = new ConnectionString(Application.persistentDataPath + "/" + name + ".db");
            }
            var db   = new LiteDatabase(conString);
            var repo = new LiteRepository(db);

            container.BindInstance(db).AsSingle();
            container.BindInstance(repo).AsSingle();
        }
예제 #14
0
        /// <summary>
        /// Binds a <see cref="FlowCoordinator"/> into the Container. This creates the flow coordinator, repairs its dependencies, and adds it to the container.
        /// </summary>
        /// <typeparam name="T">The type of the FlowCoordinator.</typeparam>
        /// <param name="Container">The Container to install this FlowCoordinator into.</param>
        public static void BindFlowCoordinator <T>(this DiContainer Container) where T : FlowCoordinator
        {
            var inputSystem     = Container.Resolve <BaseInputModule>();
            T   flowCoordinator = new GameObject(typeof(T).Name).AddComponent <T>();

            flowCoordinator.SetField <FlowCoordinator, BaseInputModule>("_baseInputModule", inputSystem);
            Container.QueueForInject(flowCoordinator);
            Container.BindInstance(flowCoordinator).AsSingle();
        }
예제 #15
0
    private void SpawnShip(DiContainer container, float speed)
    {
        container.Bind <ShipFacade>().AsSingle();
        container.Bind <Transform>().FromComponentOnRoot();
        var shipPrefab = ships[Random.Range(0, ships.Length)];
        var ship       = container.InstantiatePrefab(shipPrefab);

        container.Bind <ShipHealthHandler>().FromNewComponentOn(ship).WhenInjectedInto <ShipFacade>();
        container.BindInstance(speed).WhenInjectedInto <ShipInputHandler>();
    }
예제 #16
0
        public void Initialize()
        {
            var loadingScreen = _loadingScreenViewFactory.Create(
                _viewPrefabsConfig.LoadingScreenViewPrefab);

            loadingScreen.Initialize();
            _container.BindInstance(loadingScreen);

            _sceneManagementController.ToTitle();
        }
예제 #17
0
        private void InstallSubContainer(DiContainer subContainer)
        {
            subContainer.Install <AssetLoaderInstaller>();
            subContainer.Install <DataLoaderInstaller>();

            subContainer.Bind <WebRequester>().AsSingle();
            subContainer.Bind <ErrorManager>().AsSingle();

            subContainer.BindInstance(networkSettings).AsSingle();
        }
예제 #18
0
    public void _07_MultipleAncestorsAndSelfResolve()
    {
        // ↓こんな感じのペアレンティングツリー
        // [p0a0,p0a1] [p1a0] [p2a0,p2a1]
        //         \     |     /
        //          [p0, p1, p2]
        //            \  |  /
        //              self

        var p0a0 = new DiContainer();
        var p0a1 = new DiContainer();
        var p0   = new DiContainer(new[] { p0a0, p0a1 });

        var p1a0 = new DiContainer();
        var p1   = new DiContainer(new[] { p1a0 });

        var p2a0 = new DiContainer();
        var p2a1 = new DiContainer();
        var p2   = new DiContainer(new[] { p2a0, p2a1 });

        var self = new DiContainer(new[] { p0, p1, p2 });

        // 祖先コンテナにバインド
        p1a0.BindInstance("p0a0");
        Assert.AreEqual("p0a0", self.Resolve <string>());

        // 別の親を子として持つ祖先コンテナにバインド
        p1a0.BindInstance("p1a0");

        // Resolve()は"Found multiple matches"のエラー(深さが同じ複数の祖先コンテナは一つの祖先コンテナとして振る舞う)
        AssertThrows <ZenjectException>(() => self.Resolve <string>());
        // -> Found multiple matches when only one was expected for type 'string'.

        // ResolveAll<T>()はペアレンティングツリーにバインドされたもの全てを集めてList<T>で返す(幅優先探索で解決)
        p2.BindInstance("p2");
        var list = self.ResolveAll <string>();

        Assert.AreEqual(3, list.Count);
        Assert.AreEqual("p2", list[0]);
        Assert.AreEqual("p0a0", list[1]);
        Assert.AreEqual("p1a0", list[2]);
    }
예제 #19
0
 public static void DeclareBrokableInstance <T>(this DiContainer container)
 {
     if (container.HasBinding <IInstanceBroker>())
     {
         var instanceBroker = ProjectContext.Instance.Container.Resolve <IInstanceBroker>();
         instanceBroker.Declare <T>();
     }
     else
     {
         container.BindInstance(typeof(T)).WithId(InstanceBroker.InjectId.BrokableInstanceType);
     }
 }
예제 #20
0
    public void _04_BindParentAndSelfResolve()
    {
        // バインドしていないのでエラー
        AssertThrows <ZenjectException>(() => SelfContainer.Resolve <string>());
        // -> Unable to resolve 'string'.

        // 親コンテナにバインドされていれば自コンテナのResolve()は親を辿って解決される
        ParentContainer.BindInstance("parent");
        Assert.AreEqual("parent", SelfContainer.Resolve <string>());

        // 自コンテナにバインドされていればそのまま解決される
        SelfContainer.BindInstance("self");
        Assert.AreEqual("self", SelfContainer.Resolve <string>());

        // ResolveAll()による解決の探索には親コンテナツリーも含まれる
        var list = SelfContainer.ResolveAll <string>();

        Assert.AreEqual(2, list.Count);
        Assert.AreEqual("self", list[0]);
        Assert.AreEqual("parent", list[1]);
    }
예제 #21
0
        private void InstallChunkFacade(DiContainer subContainer, ChunkRequest chunkRequest)
        {
            subContainer.BindInstance(chunkRequest);

            subContainer.Bind <ChunkView>().ToSinglePrefab(settings.chunk.chunkPrefab);
            subContainer.Bind <ChunkBaseView>().ToSinglePrefab(settings.chunk.chunkBasePrefab);

            subContainer.Bind <Chunk>().ToSingle();
            subContainer.BindAllInterfacesToSingle <Chunk>();

            subContainer.Bind <ChunkBase>().ToSingle();
            subContainer.BindAllInterfacesToSingle <ChunkBase>();
        }
예제 #22
0
        public void Setup()
        {
            _container = new DiContainer();
            var mapSettings = new Installer.Settings.MapSettings();

            mapSettings.columns = 0;
            mapSettings.rows    = 0;
            var translatorMock = new BoardTranslator(mapSettings);

            var roadTilesMock = new Installer.Settings.RoadTiles();

            roadTilesMock.cfcTile          = new GameObject("CFC");
            roadTilesMock.deadEndRoadTile  = new GameObject("DeadEnd");
            roadTilesMock.turnRoadTile     = new GameObject("Turn");
            roadTilesMock.straightRoadTile = new GameObject("Straight");
            roadTilesMock.crossRoadTile    = new GameObject("CrossRoad");
            roadTilesMock.tJunctionTile    = new GameObject("TJunction");

            _container.BindInstance(translatorMock);
            _container.BindInstance(roadTilesMock);
            _container.Bind <RoadDrawer>().ToSingleGameObject();
        }
예제 #23
0
    public void _05_BindAncestorAndSelfResolve()
    {
        // バインドしていないのでエラー
        AssertThrows <ZenjectException>(() => SelfContainer.Resolve <string>());
        // -> Unable to resolve 'string'.

        // 親コンテナツリーのどこかにバインドされていれば自コンテナのResolve()は親を辿って解決される
        AncestorContainer.BindInstance("ancestor");
        Assert.AreEqual("ancestor", SelfContainer.Resolve <string>());

        // より親コンテナツリーの中で近いコンテナ優先で解決される
        ParentContainer.BindInstance("parent");
        Assert.AreEqual("parent", SelfContainer.Resolve <string>());
    }
예제 #24
0
        /// <summary>
        /// Binds a <see cref="ViewController"/> into the Container. This creates the view controller, repairs its dependencies, and adds it to the container.
        /// </summary>
        /// <typeparam name="T">The type of the ViewController.</typeparam>
        /// <param name="Container">The Container to install this ViewController into.</param>
        /// <param name="active">Whether or not to enable it after its binded.</param>
        public static void BindViewController <T>(this DiContainer Container, bool active = false) where T : ViewController
        {
            T   vc        = new GameObject(typeof(T).Name, typeof(VRGraphicRaycaster), typeof(CurvedCanvasSettings), typeof(CanvasGroup), typeof(T)).GetComponent <T>();
            var raycaster = Container.Resolve <PhysicsRaycasterWithCache>();

            vc.GetComponent <VRGraphicRaycaster>().SetField("_physicsRaycaster", raycaster);
            vc.rectTransform.anchorMin        = new Vector2(0f, 0f);
            vc.rectTransform.anchorMax        = new Vector2(1f, 1f);
            vc.rectTransform.sizeDelta        = new Vector2(0f, 0f);
            vc.rectTransform.anchoredPosition = new Vector2(0f, 0f);
            vc.gameObject.SetActive(active);

            Container.QueueForInject(vc);
            Container.BindInstance(vc).AsSingle();
        }
예제 #25
0
        public void TestInjectorContainsAllInjectableFields()
        {
            var container  = new DiContainer();
            var injectable = new Injectable("A");

            container.Bind <IInjectable>().ToInstance(injectable);

            var instance = new TestClass();

            container.BindInstance(instance);

            container.TryResolveAll();

            Assert.IsNotNull(instance.Injectable);
            Assert.AreEqual("A", instance.Injectable.Name);
        }
예제 #26
0
        public override void Install(DiContainer container)
        {
            container.BindInstance(rawInputChecker);
            container.BindInstance(mousePositionProvider);
            container.BindInstance(faceTracker);
            container.BindInstance(handTracker);
            container.BindInstance(externalTracker);
            container.BindInstance(gamepadListener);
            container.BindInstance(midiInputObserver);
            container.BindInstance(openCvFacePose);

            //終了前に監視処理を安全にストップさせたいものは呼んでおく
            container.Bind <IReleaseBeforeQuit>()
            .FromInstance(mousePositionProvider)
            .AsCached();
            container.Bind <IReleaseBeforeQuit>()
            .FromInstance(rawInputChecker)
            .AsCached();
        }
예제 #27
0
    public void _06_MultipleParentsAndSelfResolve()
    {
        var parents = new[]
        {
            new DiContainer(),
            new DiContainer(),
            new DiContainer(),
        };

        var self = new DiContainer(parents);

        // 親コンテナ群にそれぞれバインド
        parents[0].BindInstance("p0");
        parents[1].BindInstance("p1");
        parents[2].BindInstance("p2");

        // ResolveAll<T>()は親コンテナ群にバインドされたものを集めてList<T>で返す
        var list = self.ResolveAll <string>();

        Assert.AreEqual(3, list.Count);
        Assert.AreEqual("p0", list[0]);
        Assert.AreEqual("p1", list[1]);
        Assert.AreEqual("p2", list[2]);

        // Resolve()はエラー(複数の親コンテナは一つの親コンテナとして振る舞う)
        AssertThrows <ZenjectException>(() => self.Resolve <string>());
        // -> Found multiple matches when only one was expected for type 'string'.

        // 自コンテナにバインドされていればエラーにならずに解決される
        self.BindInstance("self");
        Assert.AreEqual("self", self.Resolve <string>());

        // 自コンテナにバインドしたものはResolveAll()のListの先頭にくる
        list = self.ResolveAll <string>();
        Assert.AreEqual(4, list.Count);
        Assert.AreEqual("self", list[0]);
        Assert.AreEqual("p0", list[1]);
        Assert.AreEqual("p1", list[2]);
        Assert.AreEqual("p2", list[3]);
    }
예제 #28
0
        protected virtual void Initialize()
        {
            Assert.IsNull(_container);

            _container = new DiContainer(new[] { StaticContext.Container });

            // Make sure we don't create any game objects since editor windows don't have a scene
            _container.AssertOnNewGameObjects = true;

            UniDiManagersInstaller.Install(_container);

            _container.Bind <Kernel>().AsSingle();
            _container.Bind <GuiRenderableManager>().AsSingle();
            _container.BindInstance(this);

            InstallBindings();

            _container.QueueForInject(this);
            _container.ResolveRoots();

            _kernel.Initialize();
        }
예제 #29
0
    public void _08_MultipleParentsAndAncestorsAndSelfResolve()
    {
        // ↓こんな感じのペアレンティングツリー
        // [p0a0,p0a1] [p1a0] [p2a0,p2a1]
        //         \     |     /
        //          [p0, p1, p2]
        //            \  |  /
        //              self

        var p0a0 = new DiContainer();
        var p0a1 = new DiContainer();
        var p0   = new DiContainer(new[] { p0a0, p0a1 });

        var p1a0 = new DiContainer();
        var p1   = new DiContainer(new[] { p1a0 });

        var p2a0 = new DiContainer();
        var p2a1 = new DiContainer();
        var p2   = new DiContainer(new[] { p2a0, p2a1 });

        var self = new DiContainer(new[] { p0, p1, p2 });

        // 祖先コンテナにバインド
        p1a0.BindInstance("p1a0");
        Assert.AreEqual("p1a0", self.Resolve <string>());

        // 親コンテナにバインド
        // WARNING: 深さが同じコンテナ群にバインドした場合と違ってエラーにならない
        p0.BindInstance("p0");
        Assert.AreEqual("p0", self.Resolve <string>());

        // ResolveAll<T>()はペアレンティングツリーにバインドされたもの全てを集めてList<T>で返す(幅優先探索で解決)
        var list = self.ResolveAll <string>();

        Assert.AreEqual(2, list.Count);
        Assert.AreEqual("p0", list[0]);
        Assert.AreEqual("p1a0", list[1]);
    }
예제 #30
0
        //[SerializeField] private OpenCVFacePose openCvFacePose = null;

        public override void Install(DiContainer container)
        {
            //NOTE: 2つの実装が合体したキメラ実装を適用します。コレが比較的安全でいちばん動きも良いので。
            container.Bind <IKeyMouseEventSource>()
            .FromInstance(new HybridInputChecker(robustRawInputChecker, globalHookInputChecker))    //globalHookInputChecker)
            .AsCached();
            container.BindInstance(mousePositionProvider);
            container.BindInstance(faceTracker);
            container.BindInstance(handTracker);
            container.BindInstance(externalTracker);
            container.BindInstance(gamepadListener);
            container.BindInstance(midiInputObserver);
            //container.BindInstance(openCvFacePose);

            //終了前に監視処理を安全にストップさせたいものは呼んでおく
            container.Bind <IReleaseBeforeQuit>()
            .FromInstance(robustRawInputChecker)
            .AsCached();

            container.Bind <IReleaseBeforeQuit>()
            .FromInstance(globalHookInputChecker)
            .AsCached();
        }