StrangeIoc是一款基于MVCS的一种框架,是对MVC思想的扩展,是专门针对Unity3D开发的一款框架,非常好用。

一、MVCS分别代表什么

  MVCS框架是一种模块的分离,一种写代码的规则,目的是便于代码的管理修改,更有利于编码思维。将UI和逻辑分开,StrangeIoc框架就很好地实现了UI和逻辑的分离以及各个模块的分离。

    1、M 即Model层:是本地数据类型的容器,比如从服务器、表、xml等获得的数据赋值给model,以后再取用数据时直接读取model对象即可。一般为单例的对象。

    2、V 即View层:是视图,一般指UI,在StrangeIoc中View一般以组件的形式挂在物体身上的,负责查找UI上需要交互的对象。并且在view中提供更新UI的方法。View层又分为负责纯UI的View层和负责交互的Mediator层。

    3、C 即Command层:是一个个命令,这些命令在Context中会和事件绑定,绑定后只要触发事件就会执行对应的Command,Command是框架的核心 负责和service层、model层 以及 Mediator(中间层)的交互。

    4、S 即Service层:是服务层 ,和服务端进行交互的层,在Service层中定义了一些向服务端请求数据,更新数据,保存数据等方法,这些方法由Command层调用。

二、StrangeIoc的使用和执行顺序

    1、首先自定义一个ContextView类的派生类(如MyContextView),和一个MVCSContext类的派生类(如MyContext),创建一个MyContext对象赋值给MyContextView的继承属性context,MyContext类负责进行一系列的Bind,绑定之后当绑定的类进行创建时,被绑定的类会按照指定的规则自动创建(是否为单例,指定名称等);

        2、启动context(创建MyContext对象时可选择是否自动启动),此时会触发ContextEvent.START事件。可以在MyContext中绑定ContextEvent.START事件到一个命令,用来执行一些初始化操作(如对一些单例进行初始化),Once()指的是触发一次后就解绑:
commandBinder.Bind(ContextEvent.START).To<StartCommand>().Once(); 3、依赖注入:对Mediator、Command等层中的类中的属性打[Inject]注入标记,好让StrangeIoc自动为该属性进行赋值。

    4、当View类的派生类被创建时(如MyView1,它们一般事先挂载在UI物体上),和MyView1绑定的Mediator派生类(如MyView1Mediator)也会被创建(自动挂载到该UI物体上),并且自动执行OnRegister方法。在MyView1Mediator类中的OnRegister方法内,可以调用MyView1类中的方法来进行UI更新,也可以通过dispatcher触发指定的事件,事件触发后会自动调用与该事件绑定的Command派生类中的Execute()方法。

        5、Command派生类又可以和Service的派生类、Model的派生类进行交互。

三、 其他

    1、Bind,StrangeIoc提供了绑定的功能(链式调用的形式),在MVCSContext派生类中做绑定,可以绑定类和类,接口和类,类和方法,事件和命令等等,都可以进行绑定,并且可以指定绑定后的规则(是否为单例,是否执行一次后销毁,指定name等)。

如:commandBinder.Bind(ContextEvent.START).To().Once();

        2、通过Bind把事件绑定给command后,就可以通过dispatcher触发绑定事件来启动一个command,command启动时会自动执行Execute()方法。也可以通过dispatcher.AddListener()方法来给指定事件注册监听回调函数

        3、自定义的Command派生类可以继承自EventCommand类,它继承自Command类,EventCommand内定义了一个全局的dispatcher

    4、Inject,Inject就是注入,StrangeIoc是依赖注入的框架,他的功能就是我们想获得某种类型的对象时不需要自己去创建,只要加上[Inject]标识就可以根据你bind时的规则获得对象。

    5、Mediator,中间层,负责和UI、Command之间交互。他的功能就是隔离了UI和逻辑。UI只能和Mediator交互。

    6、dispatcher是事件触发器,是StrangeIOC实现的消息发送机制,触发事件后会自动调用和该事件类型绑定的Command(或者调用在事件上注册的回调函数)。分为全局dispatcher和局部dispatcher,它们的区别:

             a.可以在任何地方定义一个变量来引用全局的dispatcher,所以通过全局dispatcher注册的事件回调,自然就可以在任何地方触发了。
b.局部的dispatchar只是一个单独的IEventDispatcher的实例,要注册、触发事件就必须先拿到该dispatchar的引用。
c.不管是全局的,还是局部的dispatchar,它都只能触发在它自身上已经注册的事件。

    7.View中的UI层继承自View类,mediator层继承自Mediator类,而View和Mediator都继承自MonoBehaviour类,所以UI层和mediator层的类同样继承了Awake和Start方法,在重写view层的Start方法时,需要注意,一定要先执行他父类的方法base.Start();如果不先执行,就没办法自动创建改View中对应的meidator,自动创建是在框架中执行的。

四、注意:

  1.一般不推荐在UI层进行依赖注入,官方推荐的在mediator层进行注入,UI去和mediator层交互。在View中注入的数据在Awake方法中是调用不到的 会报空引用,因为,数据的注入执行顺序在Awake之后,在Start之前。从而可以看出,mediator层的OnRegister方法是晚于Awake执行,早于Start方法的。

        2.用dispatcher.AddListener()注册一个事件后,就要有对应的dispatcher.RemoveListener()来删除这个事件监听(一般在游戏销毁的OnRemove()方法内,或回调函数内定义)。

        3.Command类中有一个Retain()方法,可以在执行该命令期间,保持该Command的实例不被销毁,这个很有用,可以确保回调函数的执行,一般在Execute()中使用。对应的有 Release()方法,释放该Command实例,销毁它,一般使用在回调函数中。

        4.测试时,如果发现事件没有触发,那就检查你注册该事件的dispatcher和你用来触发事件的dispatcher是否对应(局部or全局?)。

五、自定义使用

        应尽量避免使用StrangeIoc的依赖注入:这点很重要,因为通过StrangeIoc依赖注入时,涉及到序列化和反序列化,这会降低性能,所以对于那些需要单例的类最好在类中自己实现,把单例的初始化放在StartCommand中,如:AudioManager.Instance.Init();,这样就省去了绑定生成单例和依赖注入的过程,稍微提高了性能。

StrangeIoc框架学习的更多相关文章

  1. StrangeIoc框架学习----在项目中实战

    最近,因为公司的项目一直在研究StrangeIoc框架,小有所得,略作记录. StrangeIoc是一款基于MVCS的一种框架,是对MVC思想的扩展,是专门针对unity开发的一款框架,非常好用. 一 ...

  2. 框架学习笔记:Unity3D的MVC框架——StrangeIoC

    作为从AS3页游走过来的人,看见StrangeIoC会额外亲切,因为StrangeIoC的设计和RobotLegs几乎一致,作为一款依赖注入/控制反转(IoC)的MVC框架,StrangeIoC除了使 ...

  3. IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API

    IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...

  4. Unity StrangeIoC框架

    Unity StrangeIoC框架  http://blog.csdn.net/y1196645376/article/details/52746251    

  5. Hadoop学习笔记—18.Sqoop框架学习

    一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加 ...

  6. Spring框架学习一

    Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...

  7. EF框架学习手记

    转载: [ASP.NET MVC]: - EF框架学习手记 1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架 ...

  8. web框架学习列表

    转载自鲁塔弗的博客,原文网址:http://lutaf.com/148.htm web framework层出不穷,特别是ruby/python,各有10+个,php/java也是一大堆 根据我自己的 ...

  9. 2013 最新的 play web framework 版本 1.2.3 框架学习文档整理

    Play framework框架学习文档 Play framework框架学习文档 1 一.什么是Playframework 3 二.playframework框架的优点 4 三.Play Frame ...

随机推荐

  1. C# 读Autofac源码笔记(2)

    刚看了下Autofac属性注入的源码 首先看看WithProperty方法   image.png Autofac将我们的属性值,存在了一个list集合中   image.png 然后将这个集合传递到 ...

  2. orcal exists

    Oracle使用了一个复杂的自平衡B-tree结构.通常,通过索引查询数据比全表扫描要快.当 Oracle找出执行查询和Update语句的最好路径时,Oracle优化器将使用索引.同样在联结多个表时使 ...

  3. 初学python - 使用pip安装扩展库

    cmd pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PyMySQL - 使用清华镜像下载PyMySQL pip python包管理工 ...

  4. 910. Smallest Range II

    Given an array A of integers, for each integer A[i] we need to choose either x = -K or x = K, and ad ...

  5. Django 允许其他可以访问的设置

    第一步:在run下修改edit 第二步:host改为0.0.0.0 第三步:setting文件中将    ALLOWED_HOSTS 改为 :ALLOWED_HOSTS = ['*',] 这样就可以通 ...

  6. android开发如何获取res/raw和assets文件夹的路径

    ---恢复内容开始--- android开发如何获取res/raw和assets文件夹的路径,主要分为两种情况: 1.如果你只是拷贝动作,那么你只需要得到res/raw和assets文件输入流就可以, ...

  7. XPath语法使用的一些心得

    XPath语法还是很强大的,支持一些函数和操作符,方便操作,但是因为版本的原因可能有的函数只能在XPath2(2007)里使用,而不能在XPath1(1999)中使用,比如函数 ends-with(s ...

  8. Ping程序

    一.概述 Ping程序是对两个TCP/IP系统连通性进行测试的基本工具.该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答. 二.格式 大多数TCP/IP实现都在内核中直接支持Pin ...

  9. ElasticSearch 因为磁盘空间不够引起的数据插入错误。(message [ClusterBlockException[blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];]])

    ES升级到624测试从Kettle插入数据的时候,经常提示如下错误 message [ClusterBlockException[blocked by: [FORBIDDEN/12/index rea ...

  10. BZOJ2748 音量调节

    音量调节   Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开 ...