unity StrangeIoc

本文深入探讨Unity框架StrangeIoC的学习心得与实践,解析控制反转(IoC)与依赖注入(DI)的概念,详细介绍框架的MVCS结构及其实现流程,分享在Unity项目中的应用经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

1.实用链接

2.控制反转(Inversion of Control)

  • 首先明白一个概念,即明白什么是控制反转。它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所为的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了内部的容器。
    依赖注入:是一个上诉概念的一个实现。这是当前最流行的IoC类型。基本原则就是:应用组件不应该负责查找资源或者其他依赖的写作对象。配置对象的工作应该由Ioc容器负责。具体查看:控制反转(IoC)与依赖注入(DI)

3.框架流程

  • StrangeIoC框架图
    885799-20190412104749638-1249749770.png

  • 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<RequestScoreCommand>();
    
            //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)
      区分多个绑定:

       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带来的便捷的注入。
    885799-20190412140743285-324631886.png
    885799-20190412140805292-1207017947.png
    885799-20190412140820379-2114304718.png

总结

  • View只负责显示和监听,当发生UI操作的时候,view通知mediator,mediator在调用具体的command去执行具体的任务。Service和model只和command交互,不去处理view的事情。
    最后附上demo的框架图(我将model提取出来公用):
    885799-20190412141644811-149683218.png

885799-20190412141716151-1366583319.png

转载于:https://www.cnblogs.com/fzuljz/p/10694308.html

前言 unity的框架,除了各大公司自己内部使用的,开源并好用的实际并不是很多,我会慢慢挖掘,依次写出自己的一点见解,错误的地方,望各路大神指正。 一、基本概念 控制反转(Inversion of Control,英文缩写为IOC),我的理解就是,原本A类要获取B类的对象,需要你在A类中自己New一个对象,那么是由A来获取并控制B的对象,IOC就是把对象获取的这个过程交给容器和依赖注入来处理,A类并不知道B的对象是哪里来的,对B对象的控制,由自己变成了其他类,官方一点的概念可以百度,这个还是蛮多的。 二、StrangeIOC基础类型 实际要理解一个框架的类型,还是要自己看源码,这里我只说一下几个重要类型的作用,这个看源码的时候有个印象,也方便理解,而且说这部分的帖子也很多,我就不再赘述了。 1.Context 上下文组件定义程序边界,也就是可以把一个程序定义成多上下文,让代码更加模块化 它提供了程序入口,也算是框架中耦合度最高的地方 2.Binder和Binding 这两个类是这个框架最重要的组成部分 Binding存储了对象的绑定关系,而Binder存储了Binding的对象 3.View和Mediator MVCS中的View层,View只用于显示,也就是View只负责管理UI,Mediator负责界面逻辑,事件响应等 4.Model MVCS中的Model层,负责数据部分 5.Command MVCS中的Control层,负责执行逻辑代码 6.Service MVCS中的Service层,负责与第三方交互,这个Service我理解的,并不是一定指代服务器,也可以是其他的软件,什么都可以,它就是我们程序对外的接口 7.Dispatcher 派发器是框架内通信主线的其中一种,用来派发消息,触发命令,从而进一步解耦 8.Signal 信号是框架内另外一种通信主线,它采用强类型,来绑定信号和命令之间的关系,实现消息响应的触发 9.ReflectionBinder 反射部分,通过binding来获取类的信息,存储在ReflectedClass中 10.injector 注入器,通过反射获取的信息,来实例化请求的对象 --------------------- 作者:蓝天小僧 来源:优快云 原文:https://blog.youkuaiyun.com/zcaixzy5211314/article/details/80876228 版权声明:本文为博主原创文章,转载请附上博文链接!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值