예제 #1
0
 // Install basic functionality for most unity apps
 public static void InstallUnityStandard(DiContainer container)
 {
     container.Bind<IKernel>().AsSingleGameObject<UnityKernel>("Kernel");
     container.Bind<EntryPointInitializer>().AsSingle();
     container.Bind<IEntryPoint>().AsSingle<KernelInitializer>();
     container.Bind<ITickable>().AsLookup<UnityEventManager>();
 }
예제 #2
0
        public void RegisterBindings(DiContainer container)
        {
            container.Bind<ShipStateMoving.Settings>().AsSingle(settings.shipMoving);
            container.Bind<ShipStateDead.Settings>().AsSingle(settings.shipDead);
            container.Bind<ShipStateWaitingToStart.Settings>().AsSingle(settings.shipStarting);

            container.Bind<AsteroidSpawner.Settings>().AsSingle(settings.asteroidSpawner);
            container.Bind<Asteroid.Settings>().AsSingle(settings.asteroid);
        }
예제 #3
0
        void InitContainer()
        {
            _container = new DiContainer();
            // Note: This has to go first
            _container.Bind<CompositionRoot>().AsSingle(this);

            // Init default dependencies
            _container.Bind<MonoBehaviourFactory>().AsSingle();

            _container.Bind<UnityEventManager>().AsSingleGameObject();
        }
예제 #4
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.Bind <IReleaseBeforeQuit>()
            .FromInstance(mousePositionProvider)
            .AsCached();
            container.Bind <IReleaseBeforeQuit>()
            .FromInstance(rawInputChecker)
            .AsCached();
        }
예제 #5
0
        public void Bind <TFrom, TTo>(BindingConfiguration configuration = null) where TTo : TFrom
        {
            var bindingSetup = _container.Bind <TFrom>();

            if (configuration == null)
            {
                bindingSetup.To <TTo>().AsSingle();
                return;
            }

            if (configuration.ToInstance != null)
            {
                var instanceBinding = bindingSetup.FromInstance((TFrom)configuration.ToInstance);

                if (configuration.AsSingleton)
                {
                    instanceBinding.AsSingle();
                }

                return;
            }

            if (configuration.ToMethod != null)
            {
                var methodBinding = bindingSetup.FromMethod(x => (TTo)configuration.ToMethod(this));

                if (configuration.AsSingleton)
                {
                    methodBinding.AsSingle();
                }

                return;
            }

            if (!string.IsNullOrEmpty(configuration.WithName))
            {
                bindingSetup.WithId(configuration.WithName);
            }

            var binding = bindingSetup.To <TFrom>();

            if (configuration.AsSingleton)
            {
                binding.AsSingle();
            }

            if (configuration.WithNamedConstructorArgs.Count > 0)
            {
                binding.WithArguments(configuration.WithNamedConstructorArgs.Values);
            }

            if (configuration.WithTypedConstructorArgs.Count > 0)
            {
                var typePairs = configuration.WithTypedConstructorArgs.Select(x => new TypeValuePair(x.Key, x.Value));
                binding.WithArgumentsExplicit(typePairs);
            }
        }
예제 #6
0
        public override void Install(DiContainer container)
        {
            Container.Bind <IEncounterLocker>().To <EncounterLocker>().AsTransient();
            Container.Bind <IEncounterUnlocker>().To <EncounterUnlocker>().AsTransient();

            SignalBusInstaller.Install(container);
            container.DeclareSignal <SceneChangedSignal>().OptionalSubscriber();

            container.Bind <SizeManager>().To <SizeManager>().AsSingle();

            container.Bind <ICurve>().To <AccelerationCurve>().AsTransient();
            container.Bind <IShiftTransformsAnimator>().To <ShiftTransformsAnimator>().AsTransient();

            container.BindFactory <Object, GameObject, GameObjectFactory>()
            .FromFactory <PrefabFactory <GameObject> >();
            container.BindFactory <Object, RectTransform, RectTransformFactory>()
            .FromFactory <PrefabFactory <RectTransform> >();
        }
        public static void BindPriority(
            DiContainer container, Type initializableType, int priorityCount)
        {
            Assert.That(initializableType.DerivesFrom<IInitializable>(),
                "Expected type '{0}' to derive from IInitializable", initializableType.Name());

            container.Bind<Tuple<Type, int>>().To(
                Tuple.New(initializableType, priorityCount)).WhenInjectedInto<InitializableHandler>();
        }
        public void Bind(Type fromType, Type toType, BindingConfiguration configuration = null)
        {
            var bindingSetup = _container.Bind(fromType);

            if (configuration == null)
            {
                bindingSetup.To(toType).AsSingle();
                return;
            }

            if (configuration.ToInstance != null)
            {
                var instanceBinding = bindingSetup.FromInstance(configuration.ToInstance);

                if (configuration.AsSingleton)
                {
                    instanceBinding.AsSingle();
                }

                return;
            }

            if (configuration.ToMethod != null)
            {
                var methodBinding = bindingSetup.FromMethod(x => configuration.ToMethod(this));

                if (configuration.AsSingleton)
                {
                    methodBinding.AsSingle();
                }

                return;
            }

            var binding = bindingSetup.To(toType);

            if (!string.IsNullOrEmpty(configuration.WithName))
            {
                binding.WithConcreteId(configuration.WithName);
            }

            if (configuration.AsSingleton)
            {
                binding.AsSingle();
            }

            if (configuration.WithNamedConstructorArgs.Count > 0)
            {
                binding.WithArguments(configuration.WithNamedConstructorArgs.Values);
            }

            if (configuration.WithTypedConstructorArgs.Count > 0)
            {
                var typePairs = configuration.WithTypedConstructorArgs.Select(x => new TypeValuePair(x.Key, x.Value));
                binding.WithArgumentsExplicit(typePairs);
            }
        }
 public static void BindCommandHandler <T, TH>(this DiContainer container)
     where T : ICommand
     where TH : ICommandHandler
 {
     container.Bind <ICommandHandler>()
     .WithId(typeof(T))
     .To <TH>()
     .AsSingle();
 }
예제 #10
0
 public static DiContainer BindAsyncRequestHandlerFilter <T>(this DiContainer builder)
     where T : class, IAsyncRequestHandlerFilter
 {
     if (!builder.HasBinding <T>())
     {
         builder.Bind <T>().AsTransient();
     }
     return(builder);
 }
예제 #11
0
 public static ScopeConcreteIdArgConditionCopyNonLazyBinder BindComponentFromProvider <TComponent, TProvider>(
     this DiContainer container, object id = null)
     where TComponent : Component
     where TProvider : IComponentProvider <TComponent>, new()
 {
     return(container.Bind <TComponent>().WithId(id)
            .FromResolveGetter <IComponentProvisionService>(service =>
                                                            service.Provide <TComponent>(typeof(TProvider))));
 }
        public static void BindPriority(
            DiContainer container, Type tickableType, int priorityCount)
        {
            Assert.That(tickableType.DerivesFrom<ITickable>(),
                "Expected type '{0}' to derive from ITickable", tickableType.Name());

            container.Bind<Tuple<Type, int>>().To(
                Tuple.New(tickableType, priorityCount)).WhenInjectedInto<StandardKernel>();
        }
        public static SignalBinderWithId DeclareSignal <T>(this DiContainer container)
            where T : ISignalBase
        {
            var info           = new BindInfo(typeof(T));
            var signalSettings = new SignalSettings();

            container.Bind <T>(info).AsCached().WithArguments(signalSettings, info);
            return(new SignalBinderWithId(info, signalSettings));
        }
예제 #14
0
        public void TestBindAllInterfacesSimple()
        {
            var container = new DiContainer();

            container.Bind(x => x.AllInterfaces()).To <Foo>().AsTransient();

            Assert.That(container.Resolve <IFoo>() is Foo);
            Assert.That(container.Resolve <IBar>() is Foo);
        }
예제 #15
0
 public static void BindSignalToSubscriber <TSignal, TSubscriber>(this DiContainer container)
     where TSubscriber : ISignalSubscriber
     where TSignal : ISignal
 {
     container.Bind <ISignalSubscriptionBinding>()
     .To <SignalSubscriptionBinding <TSignal> >()
     .FromNew()
     .WhenInjectedInto <TSubscriber>();
 }
예제 #16
0
        public void TestBasicFailure()
        {
            var container = new DiContainer();

            container.Bind <IFoo>().ToSingle <Foo>();
            //container.Bind<Bar>().ToSingle();

            TestAssert.That(!container.ValidateResolve <IFoo>().IsEmpty());
        }
 protected virtual void InstallEncounterWriterBindings(DiContainer subcontainer)
 {
     foreach (SaveType saveType in Enum.GetValues(typeof(SaveType)))
     {
         subcontainer.Bind <IEncounterWriter>().WithId(saveType)
         .FromSubContainerResolve().ByMethod(
             (container) => BindEncounterWriterInstaller(container, saveType)).AsTransient();
     }
 }
예제 #18
0
        public void Initialize(
            [Inject] DiContainer diContainer,
            [Inject] DisposableManager dManager,
            [Inject] TickableManager tManager,
            [Inject] Service.Events.IEventsService eventService)
        {
            if (ViewInitialized)
            {
                return;
            }
            ViewInitialized = true;

            PreBind();

            Container     = diContainer;
            _dManager     = dManager;
            _tManager     = tManager;
            _eventService = eventService;

            this.ControllerProperty.DistinctUntilChanged().Subscribe(e => ListenToControllerDispose()).AddTo(this);

            //Create controller if this view is created through editor/sceneload
            if (createController && Controller == null)
            {
                IController _c = CreateController();
                _c.Bind();
                SetController(_c);
            }

            //To make IDisposable work, we have to add this instance to the disposable manager
            _dManager.Add(this);

            //Make ITickable work
            AddTickable(this);

            //Bind all interfaces for this instance
            //Container.BindAllInterfacesFromInstance(this);
            Container.Bind <IView>().FromInstance(this);
            Container.Bind <ITickable>().FromInstance(this);

            //Debug.Log(this + " init");

            AfterBind();
        }
예제 #19
0
    void Initialize(
        [Inject] DiContainer diContainer,
        [Inject] DisposableManager dManager,
        [Inject] TickableManager tManager,
        [Inject] IEventsService eventService)
    {
        if (isInitialized)
        {
            return;
        }
        isInitialized = true;

        PreBind();

        Container     = diContainer;
        _dManager     = dManager;
        _tManager     = tManager;
        _eventService = eventService;

        Profiler.BeginSample("dmanager add");

        //To make IDisposable work, we have to add this instance to the disposable manager
        _dManager.Add(this);
        Profiler.EndSample();

        //Make ITickable work
        Profiler.BeginSample("Add tickable");
        // this takes most of the time
        AddTickable(this);
        Profiler.EndSample();

        //Bind all interfaces for this instance
        Profiler.BeginSample("ITickable fromInstance");
        Container.Bind <ITickable>().FromInstance(this);
        Profiler.EndSample();
        Profiler.BeginSample("IDisposable fromInstance");
        Container.Bind <IDisposable>().FromInstance(this);
        //Container.BindAllInterfacesFromInstance(this);
        Profiler.EndSample();

        Profiler.BeginSample("AfterBind");
        AfterBind();
        Profiler.EndSample();
    }
예제 #20
0
        void InstallBindings(List <MonoBehaviour> injectableMonoBehaviours)
        {
            _container.Bind(typeof(Context), typeof(SceneContext)).To <SceneContext>().FromInstance(this);

            foreach (var decoratorContext in _decoratorContexts)
            {
                decoratorContext.InstallDecoratorSceneBindings();
            }

            InstallSceneBindings(injectableMonoBehaviours);

            _container.Bind(typeof(SceneKernel), typeof(MonoKernel))
            .To <SceneKernel>().FromNewComponentOn(this.gameObject).AsSingle().NonLazy();

            _container.Bind <ZenjectSceneLoader>().AsSingle();

            if (ExtraBindingsInstallMethod != null)
            {
                ExtraBindingsInstallMethod(_container);
                // Reset extra bindings for next time we change scenes
                ExtraBindingsInstallMethod = null;
            }

            // Always install the installers last so they can be injected with
            // everything above
            foreach (var decoratorContext in _decoratorContexts)
            {
                decoratorContext.InstallDecoratorInstallers();
            }

            InstallInstallers();

            foreach (var decoratorContext in _decoratorContexts)
            {
                decoratorContext.InstallLateDecoratorInstallers();
            }

            if (ExtraBindingsLateInstallMethod != null)
            {
                ExtraBindingsLateInstallMethod(_container);
                // Reset extra bindings for next time we change scenes
                ExtraBindingsLateInstallMethod = null;
            }
        }
예제 #21
0
        public void Awake()
        {
            if (root == null)
            {
                root = this.transform;
            }

            this.app      = this;
            presentersMap = new Dictionary <string, ValuePair <IRoute, Type> >();
            layoutsMap    = new Dictionary <string, ValuePair <IRoute, Type> >();

            container = new DiContainer();
            container.Bind <IApplication>().FromInstance(this);
            container.Bind <IRouter>().FromInstance(this);

            SetupDI();

            Configure(this, container);
        }
예제 #22
0
        public static void Install(DiContainer container)
        {
            container.BindInterfacesAndSelfTo <CustomComponentHandler>().AsSingle();
            container.Bind <BaseGameUiHandler>().AsSingle();
            container
            .BindFactory <Type, SubView.InitData, SubView, SubView.Factory>()
            .FromFactory <SubViewFactory>();
            container
            .BindFactory <Type, CustomViewController.InitData, CustomViewController, CustomViewController.Factory>()
            .FromFactory <ViewControllerFactory>();
            container
            .BindFactory <CustomScreen.InitData, CustomScreen, CustomScreen.Factory>()
            .FromFactory <ScreenFactory>();

            container.Bind <StyleSheetHandler>().AsSingle();
            container.BindInterfacesAndSelfTo <BsmlDecorator>().AsSingle();
            BindUiFactory <Popup, Popup.Factory>(container);
            BindUiFactory <CustomUiComponent, CustomUiComponent.Factory>(container);
        }
예제 #23
0
    protected override void Bind(DiContainer container)
    {
        container.Bind <DynamicModelContainer <DebuggableValueModel> >().ToSelf().AsCached();

        container.BindFactory <IDebuggableValueViewModel, DebuggableValueView, DebuggableValueViewFactory>()
        .FromMonoPoolableMemoryPool(x => x.WithInitialSize(10)
                                    .FromComponentInNewPrefab(DebugViewPrefab)
                                    .UnderTransformGroup(
                                        $"{nameof(DebugViewPrefab)} parent"));
    }
예제 #24
0
        public void TestLocal1()
        {
            var rootContainer = new DiContainer();
            var sub1          = rootContainer.CreateSubContainer();

            rootContainer.Bind <Test0>().AsSingle();
            sub1.Bind <Test1>().AsSingle();

            Assert.Throws(() => sub1.Resolve <Test1>());
        }
예제 #25
0
        public void TestAny()
        {
            var rootContainer = new DiContainer();
            var sub1          = rootContainer.CreateSubContainer();

            rootContainer.Bind <Test0>().AsSingle();
            sub1.Bind <Test4>().AsSingle();

            Assert.IsNotNull(sub1.Resolve <Test4>());
        }
예제 #26
0
    // public static void BindController<TController>(this DiContainer container)
    //     where TController : Controller
    // {
    //     container.Bind<TController>().ToSingle();
    //     container.Bind<IInitializable>().ToSingle<TController>();
    //     container.Bind<IDisposable>().ToSingle<TController>();
    // }

    public static void BindViewController <TView, TController>(this DiContainer container, GameObject viewPrefab, Transform parent)
        where TView : View
        where TController : Controller
    {
        // todo bad practice
        var view = container.InstantiatePrefab(viewPrefab, parent);

        container.Bind <TView>().FromComponentOn(view).AsSingle();
        container.BindInterfacesAndSelfTo <TController>().AsSingle();
    }
예제 #27
0
        public void TestValidateNestedContainerList()
        {
            var container = new DiContainer();

            var nestedContainer = new DiContainer();

            nestedContainer.FallbackProvider = new DiContainerProvider(container);

            container.Bind <IFoo>().ToSingle <Foo>();
            container.Bind <IFoo>().ToSingle <Foo2>();

            TestAssert.That(!container.ValidateResolve <List <IFoo> >().IsEmpty());
            TestAssert.That(!nestedContainer.ValidateResolve <List <IFoo> >().IsEmpty());

            container.Bind <Bar>().ToSingle();

            TestAssert.That(container.ValidateResolve <List <IFoo> >().IsEmpty());
            TestAssert.That(nestedContainer.ValidateResolve <List <IFoo> >().IsEmpty());
        }
예제 #28
0
        public void TestBindAllInterfaces2()
        {
            var container = new DiContainer();

            container.Bind(x => x.AllInterfaces())
            .To(x => x.AllNonAbstractClasses().InNamespace("Zenject.Tests.Convention.Two"));

            Assert.IsEqual(container.ResolveAll <IFoo>().Count, 2);
            Assert.IsEqual(container.ResolveAll <IBar>().Count, 2);
        }
        public void SetUp()
        {
            container = new DiContainer();
            container.Bind <CameraCapture>().AsSingle();

            cameraCaptureSystem = Substitute.For <ICameraCaptureSystem>();
            container.Bind <ICameraCaptureSystem>().FromInstance(cameraCaptureSystem);

            database = Substitute.For <IDatabase>();
            container.Bind <IDatabase>().FromInstance(database);

            photoGallery = Substitute.For <IPhotoGallery>();
            container.Bind <IPhotoGallery>().FromInstance(photoGallery);

            permissions = Substitute.For <IPermissions>();
            container.Bind <IPermissions>().FromInstance(permissions);

            container.Inject(this);
        }
예제 #30
0
        public void SetUp()
        {
            container = new DiContainer();

            raycastSystem = Substitute.For <IRaycastSystem>();
            container.Bind <IRaycastSystem>().FromInstance(raycastSystem).AsSingle();

            aRObject = Substitute.For <IARObject>();
            container.BindMemoryPool <IARObject, ARObjectPool>().FromInstance(aRObject);

            aRObjectAlignment = Substitute.For <IARObjectAlignment>();
            container.Bind <IARObjectAlignment>().FromInstance(aRObjectAlignment);

            cameraSystem = Substitute.For <ICameraSystem>();
            container.Bind <ICameraSystem>().FromInstance(cameraSystem);

            container.Bind(typeof(ARObjectSpawner)).To <ARObjectSpawner>().AsSingle();
            container.Inject(this);
        }
예제 #31
0
        public void TestParent2()
        {
            var rootContainer = new DiContainer();
            var sub1          = rootContainer.CreateSubContainer();
            var sub2          = sub1.CreateSubContainer();

            rootContainer.Bind <Test0>().AsSingle();
            sub2.Bind <Test2>().AsSingle();

            Assert.Throws(() => sub2.Resolve <Test2>());
        }
예제 #32
0
        public void TestParent1()
        {
            var rootContainer = new DiContainer();
            var sub1          = rootContainer.CreateSubContainer();

            rootContainer.Bind <Test0>().ToSingle();
            sub1.Bind <Test2>().ToSingle();

            Assert.IsNotNull(sub1.Resolve <Test2>());
            Assert.That(sub1.ValidateResolve <Test2>().IsEmpty());
        }
예제 #33
0
        public void TestLocal1()
        {
            var rootContainer = new DiContainer();
            var sub1          = rootContainer.CreateSubContainer();

            rootContainer.Bind <Test0>().ToSingle();
            sub1.Bind <Test1>().ToSingle();

            Assert.Throws <ZenjectResolveException>(() => sub1.Resolve <Test1>());
            Assert.That(sub1.ValidateResolve <Test1>().Any());
        }
예제 #34
0
    public static void BindPoolContainer <TPoolable, PoolFactory>(this DiContainer container, GameObject[] prefabList, int[] initialPoolSizes)
        where TPoolable : PoolableMonoBehaviour
        where PoolFactory : PlaceholderFactory <int, TPoolable>
    {
        PoolablePoolContainer <TPoolable> poolContainer = new PoolablePoolContainer <TPoolable>(prefabList, container, initialPoolSizes);

        container.BindFactory <int, TPoolable, PoolFactory>()
        .FromMethod((cont, index) => poolContainer.SpawnFromPool(index));

        container.Bind <IInitializable>().To <PoolablePoolContainer <TPoolable> >().FromInstance(poolContainer);
    }
예제 #35
0
        void InstallBindings(List <MonoBehaviour> injectableMonoBehaviours)
        {
            _container.DefaultParent = transform;

            _container.Bind <Context>().FromInstance(this);
            _container.Bind <GameObjectContext>().FromInstance(this);

            if (_kernel == null)
            {
                _container.Bind <MonoKernel>()
                .To <DefaultGameObjectKernel>().FromNewComponentOn(gameObject).AsSingle().NonLazy();
            }
            else
            {
                _container.Bind <MonoKernel>().FromInstance(_kernel).AsSingle().NonLazy();
            }

            InstallSceneBindings(injectableMonoBehaviours);
            InstallInstallers();
        }
예제 #36
0
        void InitContainer()
        {
            _container = new DiContainer();

            // Note: This has to go first
            _container.Bind<CompositionRoot>().To(this);

            if (_extraBindingLookup != null)
            {
                _extraBindingLookup(_container);
                _extraBindingLookup = null;
            }
        }
예제 #37
0
        static IEnumerable<ZenjectResolveException> ValidateInstallers(CompositionRoot compRoot)
        {
            var container = new DiContainer();
            container.Bind<CompositionRoot>().ToSingle(compRoot);

            var allInstallers = new List<IInstaller>();

            foreach (var installer in compRoot.Installers)
            {
                if (installer == null)
                {
                    yield return new ZenjectResolveException(
                        "Found null installer in properties of Composition Root");
                    yield break;
                }

                if (installer.enabled)
                {
                    installer.Container = container;
                    container.Bind<IInstaller>().To(installer);
                }

                allInstallers.AddRange(container.InstallInstallers());

                Assert.That(!container.HasBinding<IInstaller>());
            }

            foreach (var error in container.ValidateResolve<IDependencyRoot>())
            {
                yield return error;
            }

            // Also make sure we can fill in all the dependencies in the built-in scene
            foreach (var monoBehaviour in compRoot.GetComponentsInChildren<MonoBehaviour>())
            {
                if (monoBehaviour == null)
                {
                    // Be nice to give more information here
                    Log.Warn("Found null MonoBehaviour in scene");
                    continue;
                }

                foreach (var error in container.ValidateObjectGraph(monoBehaviour.GetType()))
                {
                    yield return error;
                }
            }

            // Validate dynamically created object graphs
            foreach (var installer in allInstallers)
            {
                foreach (var error in installer.ValidateSubGraphs())
                {
                    yield return error;
                }
            }
        }
예제 #38
0
        public void RegisterBindings(DiContainer container)
        {
            InstallerUtil.InstallUnityStandard(container);

            container.Bind<IDependencyRoot>().AsSingle<GameRoot>();

            container.Bind<Camera>().AsSingle(mainCamera);
            container.Bind<LevelHelper>().AsSingle();

            container.Bind<ITickable>().AsSingle<AsteroidSpawner>();
            container.Bind<AsteroidSpawner>().AsSingle();

            container.Bind<GuiHandler>().AsSingle(gui);

            container.Bind<IFactory<Asteroid>>().AsSingle<GameObjectFactory<Asteroid>>();
            container.Bind<GameObject>().AsSingle(asteroidTemplate).WhenInjectedInto<GameObjectFactory<Asteroid>>();

            container.Bind<IEntryPoint>().AsSingle<GameController>();
            container.Bind<ITickable>().AsSingle<GameController>();
            container.Bind<GameController>().AsSingle();

            container.Bind<Ship>().AsSingle(ship);
            container.Bind<ShipStateFactory>().AsSingle();
        }