Unity strangeioc框架初识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaixh_89/article/details/82184888

最近项目中用到这个架构,刚好学习下,网上看了很多资料,参差不齐,对于刚接触的人来说本不太容易,通过在几天的学习与网上资料的翻阅整理下学习心得。网上有英文文档,地址:http://strangeioc.github.io/strangeioc/TheBigStrangeHowTo.html

strangeioc是一个超轻量级和高度可扩展反转(IOC)框架,专门为c#和Unity编写,它是基于MVC框架扩展的。即MVCS框架。M(models),V(view),C(controller),S(services)。它是依据控制反转和解耦原理设计的,支持依赖注入。

控制反转(Inversion of Control,英文缩写为IOC),我的理解就是,原本A类要获取B类的对象,需要你在A类中自己New一个对象,那么是由A来获取并控制B的对象,IOC就是把对象获取的这个过程交给容器和依赖注入来处理,A类并不知道B的对象是哪里来的,对B对象的控制,由自己变成了其他类,官方一点的概念可以百度,这个还是蛮多的。出自蓝天小僧

整个框架类图如下:

Root:

继承自ContextView, ContextView继承自MonoBehaviour,一般会在这里创建一个自己的继承于MVCSContext的类, 它属于框架的入口

MVCSContext:

初始化所有的绑定,如Injection, Command,Dispatcher

CONTROLLER:

大部分游戏逻辑处理放在这一层,连接VIEW和SERVICES,MODELS层,起到数据管理的作用。

VIEW:

游戏中的UI,人物,战斗画面等一切用户可以看到的场景,均在这一层。

细分为view和mediator(中间层),UI和数据分离,view负责显示画面,mediator通过Dispatcher发送数据请求,与CONTROLLER层进行交互,起到数据交流中转站的作用。

SERVICES层:

服务层,游戏中的数据(金币,用户信息等)通过SERVICES层与外界交互,连接服务器取得数据。基本上与外部(游戏服务器)等的数据交流均通过SERVICES层完成。

MODEL:

数据模型,例如人物属性模型

WEB:

可以理解为游戏服务器。

Dispatcher:

派发器是框架内通信主线的其中一种,用来派发消息,触发命令,从而进一步解耦

Signal:

信号是框架内另外一种通信主线,它采用强类型,来绑定信号和命令之间的关系,实现消息响应的触发

ReflectionBinder:

反射部分,通过binding来获取类的信息,存储在ReflectedClass中

injector:

注入器,通过反射获取的信息,来实例化请求的对象

StrangeIOC执行流程

首选是我们自己定义的context:它会调用MVCSContext构造函数依次向上类推->CrossContext->Context构造函数

在此会调用图示两个函数,addCoreComponents函数用来指定核心组件的绑定关系,Start函数初始化框架

在Start函数中调用

instantiateCoreComponents:生成了所有这些核心组件的实例

mapBindings():映射绑定区域

postBindings:这是一个十分有用的地方放一些你需要在绑定之后运行的代码。但是他运行在Launch()之后,MVCSContext用这个方法去处理任何Views界面哪一个在寄存器中更早(在mapBindings之后被调用)。另一个明显的和有用的情况  在postBindings()中调用DontDestroyOnLoad(ContextView)。在你加载一个新的场景时用来保留ContextView(and the Context)。

可以发现所有的绑定关系都是由injectionBinder来存储的,那么这个injectionBinder是怎么来的呢

通过上面两图可知injectionBinder是在CrossContext中的属性中自己new出来的,并没有依靠依赖注入,而在CrossContextInjectionBinder的基类InjectionBinder中可以看到注入部分所需的组件,都是在它的构造中自动生成的,显然,它是所有其他组件初始化的关键

猜你喜欢

转载自blog.csdn.net/zhaixh_89/article/details/82184888