已经很久没有写博客,主要原因还是自我荒废了太久,在学习上失去了动力。最近来新的公司实习,以前都是做项目的开发,现在被调到框架组,主要从事的是框架维护还有开发。学习了许多新的知识还有优秀的框架,今天就写写自己在学习unity框架strangeIoC,学习到的一些知识还有遇到的一些坑。

1.实用链接

2.控制反转(Inversion of Control)

  • 首先明白一个概念,即明白什么是控制反转。它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所为的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了内部的容器。

    依赖注入:是一个上诉概念的一个实现。这是当前最流行的IoC类型。基本原则就是:应用组件不应该负责查找资源或者其他依赖的写作对象。配置对象的工作应该由Ioc容器负责。具体查看:控制反转(IoC)与依赖注入(DI)

3.框架流程

  • StrangeIoC框架图

  • StrangeIoC采用的是MVCS的框架结构,整个业务流程:

    • 玩家点击某个UI
    • mediator收到通知,触发某个command命令
    • command执行初始方法
    • command向model请求数据
    • 数据库无数据向service请求数据(数据库无数据,有数据则跳到第六点)
    • Service返回数据,command同步model
    • command返回数据给mediator
    • mediator通知view更新UI
  • Root

    root是进入框架的出发点,我一般都挂载在main camera上,没有特别的限定

        public class Case1ContextView : ContextView
    {
    private void Awake()
    {
    this.context = new Case1Context(this);
    }
    }
  • MVCS Context

    • 这一层是整个StrangeIoC最核心的一层,我们可以将一个或多个对象与另外一个或多个对象绑定(连接)在一起,将接口与类绑定来实现接口,将事件与事件接收绑定在一起。或者绑定两个类,一个类被创建时另一个类自动创建。
    public class Case1Context : MVCSContext
    {
    public Case1Context(MonoBehaviour view) : base(view)
    { } protected override void mapBindings()
    {
    // model
    injectionBinder.Bind<IModel>().To<Model.Model>().ToSingleton().CrossContext(); // service
    injectionBinder.Bind<IScoreService>().To<ScoreService>();

// commandBinder.Bind(Case1ServiceEvent.ReceiveScore).To();

        //command
commandBinder.Bind(Case1CommandEvent.RequestScore).To<RequestScoreCommand>();
commandBinder.Bind(Case1MediatorEvent.ClickMediator).To<ChangeSceneCommand>(); // mediator
mediationBinder.Bind<Case1View>().To<Case1Mediator>();
}
}
~~~ - 绑定从层次上分为3种:Injectionbinding ,CommandBinder, MediationBinder
**Injectionbinding**:主要是用来绑定该类型对象到上下文,这样使得程序中各个地方可以通过contextview访问得到该对象。这种绑定会生成对象。这种绑定是为了生成对象并且注入到指定对象中用的。
**commandbinding**:是为了将命令绑定到方法中用的。
**MediationBinder**:则是为了拦截view消息,而将view注入中介mediator中,然后在view的awake方法里面生成meidtaor对象。本例中将Case1View和Case1Mediator绑定起来,实现view层的点击通信到mediator层去做处理
- 绑定的映射还分为许多种:
**1.单例映射(ToStringleton)**
`injectionBinder.Bind<IWeapon>().To<PhaserGun >().ToStringleton();`实现全局的注入,实例化出来的对象是唯一的。
**2.名称映射(ToName)**
区分多个绑定: ~~~python
injectionBinder.Bind<ISocialService>().To<TwitterService>().ToSingleton().ToName(ServiceTypes.SECONDARY);
injectionBinder.Bind<ISocialService>() .To<TwitterService>().ToSingleton() .ToName(ServiceTypes.TERTIARY);
~~~ 在注入标签处也要进行名称添加。
`[Inject (ServiceTypes.TERTIARY)] public ISocialService socialService{get;set;}` **3.穿过Contexts的映射(CrossContext)**
`injectionBinder.Bind<IModel>().To<Model.Model>().ToSingleton().CrossContext();` 这个方法可以实现不同scene或者说不同context的单例实现 **4.还有许多的映射没实现过,大家可以在需要的时候在官网的api查看**
  • View和Mediator

      view只是负责单纯的界面UI更改以及操作监听,Mediator则负责对UI操作所需要的数据之类的进行调用相应的command命令。具体看代码注解更为详细易懂。较为关键的一点是**全局的IEventDispatcher**的注入
     [Inject(ContextKeys.CONTEXT_DISPATCHER)]
    public IEventDispatcher dispatcher { get; set; }
    关键字为**ContextKeys.CONTEXT_DISPATCHER**,这是个全局的派发器,当你在mediator发送某个事件的时候,可以在使用相同的派发器来监听,这样可以避免一个command创建后只能实现一次的尴尬局面。
  • command

    command可以继承EventCommand,这样可以不用自己注入全局的dispatcher。在MVCS Context中我们绑定了事件和command,当我们在Mediator中发送一个事件,可以实例化一个对应的command来进行通信。

    command的中的Execute()方法通过CommandBinder自动触发。大多数情况下 , 执行的顺序是这样的:1.实例化Command命令绑定到Ievent.type。2.注入依赖关系,包括Ievent本身。3.调用Excute()。4.删除Command命令。命令不一定要马上清理,我们可以控制它的存在时间。(Retain()和Release())

  • Service和Model

    Service是model层分出来单独处理服务端的交互的模块,他们之间一般需要同步更新数据(效率高可用异步)。一般我们在处理这一层的时候,都是写好相应的接口,然后通过继承来实现主要的逻辑。因为服务器和数据是比较多变的,虽然定义了接口,可是我们的使用的时候可以享受StrangeIoC带来的便捷的注入。





总结

  • View只负责显示和监听,当发生UI操作的时候,view通知mediator,mediator在调用具体的command去执行具体的任务。Service和model只和command交互,不去处理view的事情。

    最后附上demo的框架图(我将model提取出来公用):

unity StrangeIoc的更多相关文章

  1. Unity StrangeIoC框架

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

  2. Unity StrangeIoc框架 (一)

    最近想项目中需要使用这个架构  因此 上网看了很多资料摸索   但是对于初学者来说大多数的资料不是那么容易理解 而且文档也是英文的阅读起来有点吃力  所以记录一下自己阅读的过程  方便以后翻阅和跟我一 ...

  3. Unity StrangeIoC HelloWorld

    unity有一个叫StrangeIoC的框架插件,这里写了一个使用StrangeIoC的HelloWorld,比他自带的demo更为简单,方便理解 1.插件下载,在Asset Store直接搜索Str ...

  4. Unity StrangeIoc框架 (二)

    MVCSContex :the big picture 1.应用程序的入口是一个类成为ContextView,这是一个Monobehavior实例化MVCSContext 2.用MVCSContext ...

  5. Unity StrangeIoc框架 (三)signal信号方式

    先创建TestRoot using UnityEngine; using System.Collections; using strange.extensions.context.impl; publ ...

  6. Unity MVC框架 StrangeIoC

    StrangeIoC是一个超轻量级和高度可扩展的控制反转(IoC)框架,专门为C#和Unity编写. 项目地址:https://github.com/strangeioc/strangeioc 文档地 ...

  7. Unity 最佳实践

    转帖:http://www.glenstevens.ca/unity3d-best-practices/ 另外可以参考:http://devmag.org.za/2012/07/12/50-tips- ...

  8. 在Unity环境下使用抽象和接口

    http://gamasutra.com/blogs/VictorBarcelo/20131217/207204/Using_abstractions_and_interfaces_with_Unit ...

  9. 关于StrangeIOC框架

    在Unity上进行开发,请先看对其开发模式应用的讨论: http://www.reddit.com/r/Unity3D/comments/1nb06h/unity_design_patterns_an ...

随机推荐

  1. 搜索过滤Tip : title,site(搜标题和搜网站)

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~拿老东家作例子了.........

  2. javascript 易错点、难点笔记

    本文主要记录在学习过程中遇到的JavaScript难点或者容易疏忽的细节,也方便自己日后翻阅学习. 1.arr.length === + arr.length arr.length === + arr ...

  3. css中添加屏幕自适应方法(rem)

    css中添加屏幕自适应方法(rem) 只需要在公共css文件中添加下面代码:设计稿以750px,基础字体为20px为例,兼容性高,使用过程中px转化为rem即可 /*竖屏*/ @media scree ...

  4. 【Winform系列】Winform控件DataGridView添加数据的几种方式

    1:直接添加 在控件中设置好每列的名称 例如: DataGridViewRow row = new DataGridViewRow(); int j = dgv.Rows.Add(row); dgv. ...

  5. layer弹出框确定前验证:弹出消息框(弹出两个layer)

    作者QQ:1095737364 QQ群:123300273 欢迎加入! layer 弹出框中经常遇到要弹出表单进行修改数据, 因此在弹出框中的表单需要验证数据, 就需要在弹出一个layer, 默认的设 ...

  6. thymeleaf标签使用方法总结

    https://blog.csdn.net/quuqu/article/details/52511933 常用th标签https://www.cnblogs.com/suncj/p/4030393.h ...

  7. Tronado自定义Session

    这里就不一一诉说Session和Cookie直接的关系了,下面以一张图来概括: 下面是一个简单的Tornaod自定义Session的例子,看完后你可能会明白为什么我们在Django里可以直接使用req ...

  8. JSP (tomcat 内置对象)

    1.内置对象:    request: 方法:getParameter("txtName"):获取和页面上的name属性对象的value值       返回String       ...

  9. 前端开发笔记(3)css基础(中)

    上一篇中我们学习了html的标准文档流,下面我们先来看看如何脱离标准流. 脱离标准流 css中一共有三种方法脱离标准流 浮动 绝对定位 固定定位 浮动 我们要搞清楚什么是浮动,先来看一个标准文档流的例 ...

  10. Spring boot 多模块项目 + Swagger 让你的API可视化

    Spring boot 多模块项目 + Swagger 让你的API可视化 前言 手写 Api 文档的几个痛点: 文档需要更新的时候,需要再次发送一份给前端,也就是文档更新交流不及时. 接口返回结果不 ...