绑定说明
所有基于DI(dependency injection)框架都是将类型绑定到实例。在Zenject中,通过绑定到容器来映射引用关系;
但容器应该知道通过什么方式来实例化已经绑定的对象,通过递归解决所有对象的引用关系
过程
当容器请求构建一个类型的实例的时候,通过C#的反射找到需要构造的参数,找到所有被[Inject]标记的成员变量
和属性;挨个去关联引用,然后框架就可以通过构造函数来创建一个新实例
所有Zenject框架设计的游戏必须在代码里面指定所有需要框架管理的引用,通常使用Bind类实现
示例
namespace zenject.bind
{
public class ZenjectBind
{
private IBinded mBinded;
public ZenjectBind(IBinded binded)
{
this.mBinded = binded;
}
}
public class Binded : IBinded
{
}
public interface IBinded
{
}
}
public void Bind()
{
Container.Bind<ZenjectBind>().AsSingle();
Container.Bind<IBinded>().To<Binded>().AsSingle();
}
每当需要ZenjectBind的时候使用同一个实例对象,自动创建,但有引用到IBind对象,需要绑定IBind,
由于IBind是个接口,需要指定一个实现类
绑定格式
Container.Bind<ContractType>()
.WithId(Identifier)
.To<ResultType>()
.FromConstructionMethod()
.AsScope()
.WithArguments(Arguments)
.OnInstantiated(InstantiatedCallback)
.When(Condition)
.(Copy|Move)Into(All|Direct)SubContainers()
.NonLazy()
.IfNotBound();
字段表单说明
字段名称 | 说明 | 备注 | 默认值 |
---|---|---|---|
ContractType | 需要绑定的类型 | 已经绑定的不会再次绑定 | NO |
ResultType | 需要绑定的实例 | 绑定类型或派生类 | ContractType=ToSelf() |
Identifier | 给予id标识 | 多个同样用于区分 | Default |
ConstructionMethod | 通过什么方式构建 | 构建方式 | FromNew() |
Scope | 复用实例的频率 | 类多处引用实例方式 | AsTransient() |
Arguments | 创建新实例参数 | 直接给新实例赋值 | NO |
InstantiatedCallback | 创建新实例回调 | callback | NO |
Conditon | 条件筛选 | 满足条件才绑定 | NO |
(Copy/Move)Into(All/Direct)SubContainers | 容器选择 | 一般不用 | NO |
NonLazy | 直接实例化 | 绑定即创建 | Lazily() |
IfNotBound | 验正是否已经绑定过 | 验证ContractType和Identifier | NO |
构建方法(Construction Methods)
- FromNew() - 同过C#的new操作符来创建实例
// These are both the same
Container.Bind<Foo>();
Container.Bind<Foo>().FromNew();
- FromInstance() - 通过手动创建一个实例来绑定对象到容器,手动创建的对象不能已经被绑定
Container.Bind<Foo>().FromInstance(new Foo());
// You can also use this short hand which just takes ContractType from the parameter type
Container.BindInstance(new Foo());
// This is also what you would typically use for primitive types
Container.BindInstance(5.13f);
Container.BindInstance("foo");
// Or, if you have many instances, you can use BindInstances
Container.BindInstances(5.13f, "foo", new Foo());
- FromMethod - 通过自定义的方法来绑定实例