08.Unity Zenject入门到掌握(场景中脚本绑定)

摘要

当我们场景中有Mono脚本,Zenject框架里面的其他类有引用到这个Mono脚本的时候,我们可以将这个Mono的实例直接绑定到框架里面,安装器也是Mono附加,在安装器里面声明就好

public class Foo : MonoBehaviour
{
}

public class GameInstaller : MonoInstaller
{
    public Foo foo;

    public override void InstallBindings()
    {
        Container.BindInstance(foo);
        Container.Bind<IInitializable>().To<GameRunner>().AsSingle();
    }
}

public class GameRunner : IInitializable
{
    readonly Foo _foo;

    public GameRunner(Foo foo)
    {
        _foo = foo;
    }

    public void Initialize()
    {
        ...
    }
}

当我们场景中存在多个Mono并且拥有不确定的因素的时候,使用上面的这种方法非常的不方便,增加了要添加索引,删除了移除索引;对程序的拓展不友好

改进1

public class GameInstaller : MonoInstaller
{
    public override void InstallBindings()
    {
        Container.Bind<Foo>().FromComponentInHierarchy().AsTransient();
        Container.Bind<IInitializable>().To<GameRunner>().AsSingle();
    }
}

现在,只要有用到Foo的地方,Zenject将去场景中搜索类型为Foo的Mono脚本,这个功能和FindObjectsOfType()方法类似;
这个方法的开销大,最好不要单次使用

改进2

public class GameInstaller : MonoInstaller
{
    public override void InstallBindings()
    {
        Container.Bind<Foo>().FromComponentInHierarchy().AsCached();
        Container.Bind<IInitializable>().To<GameRunner>().AsSingle();
    }
}

这样,我们就可以达到性能优化的效果,只会在第一使用Foo的进行遍历搜索,之后使用缓存里面的所有FooMono脚本;
如果有多个Foo派生类,可以考虑使用FromComponentsInHierarchy()

另外一种处理场景中Mono脚本的方法,ZenjectBinding Mono脚本

我们可以在需要绑定多个Mono对象的场景中附件一个ZenjectBinding Mono脚本,将需要绑定的Mono脚本拖拽到Components数组上,这样处理了就不需要代码二次绑定

public class GameInstaller : MonoInstaller
{
    public override void InstallBindings()
    {
        Container.Bind<IInitializable>().To<GameRunner>().AsSingle();
    }
}

08.Unity Zenject入门到掌握(场景中脚本绑定)_第1张图片
ZenjectBinding组件拥有的属性设置:

  • BindType 绑定什么构建类型
  1. Self - 绑定自身到实例
//等同代码
Container.Bind<Foo>().FromInstance(_foo);
  1. AllInterfaces - 绑定实例的接口
//等同代码
Container.BindInterfacesTo(_foo.GetType()).FromInstance(_foo);
  1. AllInterfacesAndSelf

和2差不多,但具体参数不同,2是引用接口来定义,3可以引用实体类型

//等同代码
Container.BindInterfacesAndSelfTo(_foo.GetType()).FromInstance(_foo);
  1. BaseType - 绑定基类到实例
//等同代码
Container.Bind(_foo.GetType().BaseType()).FromInstance(_foo)
  • Identifier - 绑定tag标记id
//等同代码
Container.BindInstance(_foo).WithId("Foo1");
  • Use Scene Context - 当绑定的对象需要依赖一个Context来管理的时候
    这个干什么滴呢?
    Context大致可以理解一个管理器,之间的引用可以当作Unity物体的视图层级来理解;
    比如游戏的虚拟摇杆,需要一个管理类,直属于GameUI来管理

  • Context 这个Context是决定用哪个容器来绑定实例,一般默认是SceneContext,也可以指定为GameObjectContext;官方给出的一种用法是有多个GameObjectContext作为子容器,这里绑定一个SceneContext作为外观模式入口

社区搭建火热进行中

Zenject Github地址
Zenject 中文社区,搭建中
讨论群:518658723
欢迎喜欢使用DI的朋友加入群,有自愿报名活动!
本人代码功底浅,大神看到就当路过,希望来点评!


呀哈哈,有能力的朋友可以扫下面的打赏二维码↓↓↓
08.Unity Zenject入门到掌握(场景中脚本绑定)_第2张图片

你可能感兴趣的:(Zenject框架)