原文链接:https://hiramtan.wordpress.com/2017/08/17/zenject/
QQ群: 83596104
1.单键创建通过bind方式创建,其他构造函数有依赖其他此单例时会自动匹配类型注入.
2.大量对象(5个巨魔怪)的创建通过factory创建.
20170815
很早前有尝试过strangeioc,两年后接触过zenject然后好久都没有再用,今天打算重新拾起并且依托一个中小型项目来验证下.
strangeioc VS zenject 选后者的原因是后者持续更新,而strangeioc好久没有更新过了
zenject是一个轻量级的依赖注入框架,专为unity设计.它能让游戏逻辑低耦合并且每个模块功能划分清晰,zenject负责将模块组织到一起.
让整个游戏逻辑变得方便重用,重构,灵活可扩展.
关于,依赖,控制倒置,注入,控制反转之前有介绍过,这边不再赘述.
使用zenject可以很简单的遵循单一原则:zenject来处理类对象之间的关系,类对象本身只负责实现各自的功能.
使用zenject常见的一个误区是喜欢提取类接口,把接口绑定对象,然后其他各处使用这个接口而不是对象本身.提供接口的方式可以解模块间的耦合,但是有些特殊的类或者单例,提取接口只供这一个类实现是无意义的,还会增加维护成本,当接口需要多个类实现时,定义接口才是有意义的.
在zenject的示例工程中,SceneContext是入口逻辑.
inject方法最后调用,这样可以保证方法内使用的参数全被赋值过.如果注入的方法很多,会先调用父类中的方法,再调用子类中的方法.
注入方法依赖的对象需要提前注入.
因为monobehaviours没有构造函数,使用inject注入依赖对象是推荐的方式.
如果注入的方法是
IEnumerator.它会启动一个coroutine在当前的monobehaviours中运行,或者在Context的monobehaviours运行(比如定义的ienumerator不继承monobehaviours时),经过测试,即便是monobehaviours中注入的方法也会早于start方法执行,这样就可以把注入方法当做构造函数使用了(当自定义mono挂在游戏场景时)
使用经验表明,构造注入好于方法注入好于字段注入好于属性注入.
任何的依赖注入框架最根本就是绑定,将类型绑定到对象.
在zenject中,绑定关系在container中,当container收到请求创建一个对象时,它采用反射的方式查找构造函数需要的参数,查找被[inject]标记的字段属性方法.
然后给他们赋值相应类型的对象.(可以理解成运行前注入了很多对象,当游戏过程中创建一个新对象时,采用反射的方式,查找匹配的对象,然后将提前创建好的对象赋值过去)
public class Foo { IBar _bar; public Foo(IBar bar) { _bar = bar; } }
You can wire up the dependencies for this class with the following: