美文网首页zenJect
Zenject框架(四)

Zenject框架(四)

作者: 虫小白 | 来源:发表于2019-03-11 17:31 被阅读0次

    构造方法

    1. FromNew - 通过C#new运算符创建。如果未指定构造方法,则这是默认值。
    //这两种写法相同
    Container.Bind<Foo>();
    Container.Bind<Foo>().FromNew();
    
    1. FromInstance - 将给定实例添加到容器中。请注意,在这种情况下不会注入给定的实例。如果您希望在启动时同时注入实例,请参阅QueueForInject
    Container.Bind<Foo>().FromInstance(new Foo());
    
    // 你也可以使用这种只需要ContractType类型参数的简单方式
    Container.BindInstance(new Foo());
    
    // 这也是您通常用于原始类型的方式
    Container.BindInstance(5.13f);
    Container.BindInstance("foo");
    
    // 或者,如果你有很多的实例那么可以使用 BindInstances
    Container.BindInstances(5.13f, "foo", new Foo());
    

    3.FromMethod - 通过自定义的方法创建

    Container.Bind<Foo>().FromMethod(SomeMethod);
    
    Foo SomeMethod(InjectContext context)
    {
        ...
        return new Foo();
    }
    
    1. FromMethodMultiple-和FromMethod相同,但允许一次返回多个(或0个)实例
    Container.Bind<Foo>().FromMethodMultiple(GetFoos);
    
    IEnumerable<Foo> GetFoos(InjectContext context)
    {
        ...
        return new Foo[]
        {
            new Foo(),
            new Foo(),
            new Foo(),
        }
    }
    
    1. FromFactory - 通过自定义的工厂类创建. 这种构造方法和FromMethod 一样,但在逻辑更复杂或需要依赖项 (工厂类本身也能注入依赖项)的情况下能更清晰
    class FooFactory : IFactory<Foo>
    {
        public Foo Create()
        {
            // ...
            return new Foo();
        }
    }
    
    Container.Bind<Foo>().FromFactory<FooFactory>()
    
    1. FromIFactory - 使用自定义工厂类创建实例。这是FromFactory的更通用和更强大的替代方法,因为您可以在自定义的工厂类中使用您想要的任何种类的构造方法(与FromFactory假设FromNew().AsCached()不同)
      例如,您可以使用像这样的可编写脚本的对象的工厂:
    class FooFactory : ScriptableObject, IFactory<Foo>
    {
        public Foo Create()
        {
            // ...
            return new Foo();
        }
    }
    
    Container.Bind<Foo>().FromIFactory(x => x.To<FooFactory>().FromScriptableObjectResource("FooFactory")).AsSingle();
    

    你也可以通过下面的方式将自定义的工厂放置到子容器中:

    public class FooFactory : IFactory<Foo>
    {
        public Foo Create()
        {
            return new Foo();
        }
    }
    
    public override void InstallBindings()
    {
        Container.Bind<Foo>().FromIFactory(x => x.To<FooFactory>().FromSubContainerResolve().ByMethod(InstallFooFactory)).AsSingle();
    }
    
    void InstallFooFactory(DiContainer subContainer)
    {
        subContainer.Bind<FooFactory>().AsSingle();
    }
    

    注意,下面两行是等效的:

    Container.Bind<Foo>().FromFactory<FooFactory>().AsSingle();
    Container.Bind<Foo>().FromIFactory(x => x.To<FooFactory>().AsCached()).AsSingle();
    
    1. FromComponentInNewPrefab -实例化给定的预设体作为一个新的游戏对象,注入它身上的所有MonoBehaviour,然后以类似GetComponentInChildren工作的方式搜索类型为ResultType的结果
    Container.Bind<Foo>().FromComponentInNewPrefab(somePrefab);
    

    在这种情况下ResultType必须是接口,或者派生自UnityEngine.MonoBehaviour / UnityEngine.Component

    请注意,如果预制体上的存在多个ResultType的匹配项,则它只会匹配遇到的第一个匹配项,就像GetComponentInChildren的工作方式一样。因此,如果您要绑定预制体并且没有指定要绑定的MonoBehaviour / Component,则可以选择Transform,它将匹配预设体的根。

    1. FromComponentsInNewPrefab - 与FromComponentInNewPrefab相同,但可以匹配多个值或零值。您可以使用它作为示例,然后在某处注入List<ContractType>。可以认为类似GetComponentsInChildren
    2. FromComponentInNewPrefabResource - 将给定的预制件(在给定的资源路径中找到)实例化为新的游戏对象,在其上注入所有MonoBehaviour,然后以类似GetComponentInChildren的方式搜索类型为ResultType的结果(因为它将返回第一个匹配值)
    Container.Bind<Foo>().FromComponentInNewPrefabResource("Some/Path/Foo");
    
    1. FromComponentsInNewPrefabResource - 和 FromComponentInNewPrefab 相同,但可以匹配多个值或零值。您可以使用它作为示例,然后在某处注入List<ContractType>。可以认为类似GetComponentsInChildren
    2. FromNewComponentOnNewGameObject - 创建一个新的空游戏物体,然后在其上实例化给定类型的组件
    Container.Bind<Foo>().FromNewComponentOnNewGameObject();
    

    在这种情况下,ResultType必须派生自UnityEngine.MonoBehaviour / UnityEngine.Component

    1. FromNewComponentOnNewPrefab - 实例化给定的预设体作为新的游戏对象并在其根部实例化给定的组件。注意:预设体不必包含给定类型的组件
    Container.Bind<Foo>().FromNewComponentOnNewPrefab(somePrefab);
    
    1. FromNewComponentOnNewPrefabResource上一条的路径形式
    Container.Bind<Foo>().FromNewComponentOnNewPrefabResource("Some/Path/Foo");
    
    1. FromNewComponentOn - 在给定的物体上实例化给定的组件
    Container.Bind<Foo>().FromNewComponentOn(someGameObject);
    

    在这种情况下,ResultType 必须派生自UnityEngine.MonoBehaviour / UnityEngine.Component

    1. FromNewComponentSibling - 在当前游戏物体(current transform )上实例化给定的组件,current transform必须派生自Monobehaviour
    Container.Bind<Foo>().FromNewComponentSibling();
    

    注意,如果当前物体已经包含给定的组件实例,那么会返回该组件实例而不是创建新的实例。这和Unity的[RequireComponent]类似
    在这种情况下,ResultType 必须派生自UnityEngine.MonoBehaviour / UnityEngine.Component
    如果非派生自Monobehaviour的类要求给定类型时,会抛出异常,因为这时不存在当前游戏物体(current transform)

    1. FromComponentInHierarchy - 查找与当前上下文关联的场景层次结构中的组件,以及与任何父上下文关联的层次结构。类似的GetComponentInChildren工作,它将返回找到的第一个匹配值
    Container.Bind<Foo>().FromComponentInHierarchy().AsSingle();
    

    这种情况下,在这种情况下ResultType必须是接口,或者派生自UnityEngine.MonoBehaviour / UnityEngine.Component

    在上下文是场景上下文(SceneContext)的情况下,将会在整个场景层次面板中查找(子上下文比如游戏对象上下文(GameObjectContext)除外)。换句话说,如果上下文是场景上下文(SceneContext),它工作的方式和GameObject.FindObjectsOfType非常类似。注意,因为这个搜索工作量很大,因此要小心使用,正如GameObject.FindObjectsOfType要小心使用一样
    如果上下文是游戏对象上下文,则会在当前游戏对象的子对象及父对象的上下文中搜索
    如果上下文是工程上下文(ProjectContext),则仅在工程上下文预设体中搜索

    相关文章

      网友评论

        本文标题:Zenject框架(四)

        本文链接:https://www.haomeiwen.com/subject/jggbpqtx.html