trangeIoC是一个专门为c#和Unity3D编写的控制反转(IoC)微框架。Strange是小型的、快速的、高度可扩展的,并且是为在项目变得更大、更复杂时变得更有用而专门构建的。

​ StrangeIOC Github地址

​ 框架只是一个工具,如果你希望一个框架能干所有的事情,但现实中是没有的。具体如何用如何理解需要自己不断的总结和重构,随着自己能力的提高会提升自己的编码和设计能力。

目标

​ 本次介绍Strange控制反转的核心原则,以及Strange是如何实现这些原则的。

Strange作者自己的一些想法

​ 就像Strange框架开发者所说Strange是一个可以被称为" opinionated framework"(固执的框架)。“Opinionated的意思是它假定做事情有正确和错误的方法,“Framework” 意味着Strange不仅仅是一个库或实用程序。它不是给你一个工具而是一个工具集。框架的意义在于指导您以“正确”的方式完成某些任务。Unity3D自身底层也是这样。

​ 以与其观点目标一致的方式使用固执己见的框架通常可以解决大量问题。对于Unity和Strange来说,这当然是正确的。试图使用一个框架,而不同意它的观点,往往会导致更多的困难。

​ 在这篇指南中,你会发现一些例子,在这些例子中,Strange的观点与Unity的观点发生了碰撞。在我看来,这很好。这意味着我的应用程序的绝大部分都是结构良好的,并且异常大多以一致的方式处理。

依赖注入

​ StrangeIoC中的“IoC”代表控制反转,依赖项注入是与该概念最密切相关的机制。那么什么是“控制”?“依赖”是什么?我们求的到底是什么?我们要注射什么?

先举个例子,下面就是一个依赖的例子,ShipModel依赖外部类 LaserGun,我们通过获取Gun的实例来调用他的公开的方法。

 public class ShipModel{public LaserGun Gun { get; set; }public void Attack(){Gun.Fire();}}

但是我们要是没有Gun的实例,那么程序就会报空指针异常。

我们常用的方法是新建一个对象 如下所示

public class ShipModel{private LaserGun Gun = new LaserGun();public void Attack(){Gun.Fire();}}

​ 毫无疑问,你已经做过很多次了这样的操作。这是一个很有吸引力的选项,因为它似乎消除了外部依赖并提供了封装。其实并不是这样,这是个坏主意。为什么呢?

​ 这就是紧密耦合的本质。通过在内部定义ShipModel所依赖的具体类,我们立即排除了这种关系的所有可能性。如果我们想要手枪而不是激光枪呢?如果我们想让其他班级知道枪的事呢?如果我们想要在整个应用程序中共享一个枪的实例呢?还是两个实例?

​ 您的类所依赖的任何东西都是依赖项。将其设为私有并在内部定义它并不会消除依赖性,而只是将其隐藏起来。您希望您的依赖项是可访问的和可更改的,这样您就可以尽可能地保持灵活性。

​ 对于这个问题有许多建议的解决方案。你可能知道他们中的一些(public setter、Signletons、factories)。Strange(以及类似的框架)的前提是通过注入来满足依赖性是正确的解决方案。

 public class ShipModel{[Inject]public IGun Gun { get; set; }public void Attack(){Gun.Fire();}}

​ 在上面的例子中,您可能从未见过的代码位是[Inject]标记。如果你忽略它,你会发现我所做的只是定义了一个普通的公共getter/setter。

​ 添加[Inject]标记表明这个类有一个需要填充的依赖项。我将在接下来的几段中向您展示具体的方法。

 public interface IGun{void Fire(); //An interface defines API, not implementation}public class LaserGun : IGun{public void Fire(){Debug.Log(“滋滋滋!”); //Implementation is in the concrete class}}public class BBGun : IGun{public void Fire(){Debug.Log(“Biu Biu Biu!”);}}public class WaterPistol : IGun{public void Fire(){Debug.Log(“哗哗哗!”);}}public class SuperGun : IGun{public void Fire(){Debug.Log(“灭霸打了个响指!”);}}

所以我们在看之前的ShipModel类,我有一个枪械库,开始我想用水枪,过会我想换个武器,用用激光枪。最后我还想试试超级无敌枪——灭霸的响指。如果IGun是一个单例的话会怎么赋值呢?每次换武器的时候重新赋值一个枪吗?现在就展现出单例的缺点了。当然单例在某些情况下是很有用的。但是单例使用多了会增加你的项目依赖程度,后期很难维护和修改。

public class ShipModel{[Inject]public IGun Gun { get; set; }public void Attack(){Gun.Fire();}}

在Strange中就可以这样去注入枪的依赖,不关心具体实现类。这可能看起来很简单,因为我们的示例很简单。但是想象一下这些依赖的几十个,成百上千个。每个具体的依赖项都会稍微降低代码的灵活性。您的应用程序越大,您就越需要管理这个不断扩大的依赖圈。

那么我们需要在哪里进行绑定操作呢?答案是Context

 injectionBinder.Bind<IGun>().To<WaterGun>();

上面这样的绑定会在每次注入的时候都会生成一个WaterGun的示例。

如果我们想在游戏中只有一个水枪实例怎么办呢?

 injectionBinder.Bind<IGun>().To<WaterGun>().ToSingleton();

那么下面介绍一下Strange的整个流程

1.ContextView是一个MVCSContext的实例,它继承了MonoBehavior。

2.当在框架Start内发送信号给Command,框架进行初始化。

3.Mediators通过派发信号来与Command进行通讯。

4a.Command派发信号给Mediator

4b.Command对service和Model的API进行逻辑等操作。

5.Services通过command来对Model内的数据进行更新和设置。

6.Models和Services可能会给Mediators派发一些消息。

Views只跟Mediators进行通讯,View只处理跟Unity相关的操作,不要增加其他依赖。

明天跟大家分享一下Signal 和Command。

StrangeIOC介绍相关推荐

  1. Unity MVC框架 StrangeIoC

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Stra ...

  2. Unity3d架构之-Unity MVC框架 StrangeIoC

    Strange是一个unity3d中用于控制反转的第三方框架,控制反转(IOC-Inversion of Control)思想是类间解耦的一个重要方法,对于我来说,任何解耦技术都值得去学习.什么是IO ...

  3. 简单介绍互联网领域选择与营销方法

    在我看来,互联网领域的选择是"安家",而营销方法的不同则表现了"定家"的方式多种多样,只有选对了,"家"才得以"安定". ...

  4. 常用开源协议介绍以及开源软件规范列表

    1. 开源协议介绍 GPL: General Public License,开源项目最常用的许可证,衍生代码的分发需开源并且也要遵守此协议.该协议也有很多变种,不同变种要求会略微不同. MPL: MP ...

  5. python:Json模块dumps、loads、dump、load介绍

    20210831 https://www.cnblogs.com/bigtreei/p/10466518.html json dump dumps 区别 python:Json模块dumps.load ...

  6. pytorch学习笔记(九):PyTorch结构介绍

    PyTorch结构介绍 对PyTorch架构的粗浅理解,不能保证完全正确,但是希望可以从更高层次上对PyTorch上有个整体把握.水平有限,如有错误,欢迎指错,谢谢! 几个重要的类型 和数值相关的 T ...

  7. Python字节码介绍

    了解 Python 字节码是什么,Python 如何使用它来执行你的代码,以及知道它是如何帮到你的. 如果你曾经编写过 Python,或者只是使用过 Python,你或许经常会看到 Python 源代 ...

  8. Pytest - 使用介绍

    1. 概述 pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1.简单灵活,容易上手,文档丰富: 2.支持参数化,可以细粒度地控制要测试的测试用例: 3.能够支持简单的单 ...

  9. 遗传算法的简单介绍以及模式定理的简单证明

    遗传算法   遗传算法(Genetic Algorithm,GA),最早是由美国的John holland在20世纪70年代提出.算法通过模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程来搜 ...

最新文章

  1. python设置循环范围_python – 如何检查循环范围的重叠(重叠的年度循环周期)
  2. JS中函数和变量声明的提升
  3. mysql 删除记录代码_mysql 删除记录时报错
  4. LeetCode 239. 滑动窗口最大值(双端队列+单调栈)
  5. php解决mysql主从同步_Mysql读写分离,主从同步实现
  6. 微型计算机十号功能,青岛理工大学练习题微机原理(10页)-原创力文档
  7. 利用动态图层实现数据的实时显示
  8. 用 toto 快速建轻量级博客
  9. IMSettings 1.5.1 发布,输入法设置工具
  10. 直播app源码,隐藏导航栏和状态栏
  11. 微信小程序项目开发--打卡签到
  12. 前端使用(久派)高拍仪进行拍照上传
  13. GIS开发进阶之路(十三) Activator和new的区别、GP工具输入参数问题、写入JObject到json文件、ArcGIS Server REST API、动态规划、贪心算法
  14. PMP子过程定义总结
  15. 2020年IT运维市场大前景到底怎么样
  16. IOS微信音乐播放问题
  17. iS3 岩石隧道数据准备手册
  18. 为什么社区团购需要小程序?
  19. 如何制作公众号首图?教你一键套用图片模板
  20. 国际化分布式WEB UI自动化测试平台搭建

热门文章

  1. 2023华为od机试真题B卷【通过软盘拷贝文件】Java 实现
  2. java criteria or_java – Criteria API组合AND / OR
  3. php 怎么执行unoconv,php编辑word内容通过unoconv调用LibreOffice输出pdf打印
  4. LeetCode——LCP 29. 乐团站位[简单]——分析及代码(Java)
  5. 马云香港演讲年轻人创业
  6. DISPLAY(3)——RK3399 双路mipi拼接屏+HDMI 三屏显示
  7. 高通三屏显示-副屏display[1] dpi密度修改
  8. 智慧垃圾焚烧发电厂Web3D可视化管理系统
  9. ssm read time out的原因_如何除法令纹?法令纹的生成的原因是啥?
  10. 据大数据统计,就业薪资最高和最低的20个专业【乐搏TestPRO】