前言
在正常的绑定基础之上,也有一些其他的方法你需要联系到一块使用DiContainer;
例如你自定义一个工厂,你有可能直接调用DiContainer.Instantiate方法来实例化对象或者其他类库(比如网络库),
你需要调用DiContainer.Inject手动注入
DiContainer总是会添加自己到类里面,你可以在任何类里面调用到它;
DiContainer.Instantiate
这个实例化的方法在自定义工厂里面非常有作用,在多数情况下,
你可能选择普通的工厂来替代不需要直接引用DiContainer;
当你直接实例化对象,你可以使用DiContainer或者使用IInstantiator,都是DiContainer的内嵌;
IInstantiator存在是因为使用频率高,在自定义工厂里面,你只要关心实例化的操作,
不需要Bind、Resolve,etc;
- Instantiate< T> - 使用new操作来创建指定的类并且注入相关的信息;
注意这个方法不能用在Components/MonoBehaviours上;
然而,这个方法可以使用到ScriptableObject的派生类,代码示例:
Foo foo = Container.Instantiate<Foo>();
当你需要传递额外参数的时候
Foo foo = Container.Instantiate<Foo>(new object[] {
"foo", 5 });
等同操作方式
Foo foo = (Foo)Container.Instantiate(typeof(Foo));
Foo foo = (Foo)Container.Instantiate(typeof(Foo), new object[] {
"foo", 5 });
- InstantiatePrefab - 实例化指定的prefab并且注入上面所有的Mono脚本
GameObject gameObject = Container.InstantiatePrefab(MyPrefab);
等同代码
var gameObject = GameObject.Instantiate(MyPrefab)
DiContainer.Inject(gameObject)
MyPrefab可以是一个GameObject,或者从GameObject直接引用的一个组件,类似于GameObject.Instantiate
GameObject gameObject = Container.InstantiatePrefab(MyPrefab, MyParentTransform);
- InstantiatePrefabResource - 和InstantiatePrefab相同,可以通过Resources文件夹来索引
GameObject gameObject = Container.InstantiatePrefabResource("path/to/myprefab");
等同代码
Container.InstantiatePrefab(Resources.Load("path/to/myprefab"));
- InstantiatePrefabForComponent< T> - 实例化指定的Prefab,注入相关信息,返回prefab上拥有的指定类型的组件
var foo = Container.InstantiatePrefabForComponent<Foo>(FooPrefab)
不像InstantiatePrefab方法,这个方法允许传递参数
var foo = Container.InstantiatePrefabForComponent<Foo>(FooPrefab,