先创建TestRoot

using UnityEngine;
using System.Collections;
using strange.extensions.context.impl; public class TestRoot : ContextView { void Start()
{
context = new TestContext(this);
}
}

创建TestContext   在TestContext中我们需要把事件命令修改为 信号命令

using UnityEngine;
using System.Collections;
using strange.extensions.context.impl;
using strange.extensions.context.api;
using strange.extensions.command.api;
using strange.extensions.command.impl; public class TestContext : MVCSContext { public TestContext(MonoBehaviour view)
: base(view)
{ } public TestContext(MonoBehaviour view, ContextStartupFlags flags)
: base(view, flags)
{ }
  
   override public IContext Start()
    {
        base.Start();
        StartSignal startSignal = (StartSignal)injectionBinder.GetInstance<StartSignal>();
        startSignal.Dispatch();
        return this;
    }
protected override void addCoreComponents()
{
base.addCoreComponents();
injectionBinder.Unbind<ICommandBinder>();
injectionBinder.Bind<ICommandBinder>().To<SignalCommandBinder>().ToSingleton();
} protected override void mapBindings()
{
injectionBinder.Bind<SuccessSignal>().ToSingleton();
        injectionBinder.Bind<IService>().To<TestService>();         mediationBinder.Bind<TestView>().To<TestMediator>();         commandBinder.Bind<RequestSignal>().To<RequestCommand>();
        commandBinder.Bind<StartSignal>().To<StartCommand>().Once();
}
}

strange中IcommandBinder 事件绑定是在addCoreComponents中进行的 所以我们重写他 调用它原本的方法 再将ICommandBinder移除,在将他绑定到信号上signalCommandBinder  重写Start()  然后派发  这样就完成了        最后在mapBinding中进行之前一样的绑定 。

我们写一个脚本 把所有的信号都放在里面。   在具体情况中可以分模块将信号放在一起

  public class StartSignal : Signal
{
}
public class ClickSignal : Signal
{
}
public class RequestSignal : Signal<string>
{
   }
public class SuccessSignal : Signal
{
   }

StartCommand与之前的事件方法没有区别

public class StartCommand : Command
{
[Inject(ContextKeys.CONTEXT_VIEW)]
public GameObject contextView { get; set; }
public override void Execute()
{
GameObject test = new GameObject("test");
test.AddComponent<TestView>();
test.transform.SetParent(contextView.transform);
}
}

TestView 有略微的不同    直接实例信号进行派发

public class TestView : View
{
public ClickSignal signal_Click = new ClickSignal();
void OnGUI()
{
if (GUI.Button(new Rect(, , , ), "click"))
{
signal_Click.Dispatch();
}
}
}

在TestMediator中进行监听  然后执行方法

 public class TestMediator : Mediator
{
[Inject]
public TestView view { get; set; } [Inject]
public RequestSignal signal_Request { get; set; } public override void OnRegister()
{
view.signal_Click.AddListener(OnClick);
}
public void OnClick()
{
signal_Request.Dispatch("www.baidu.com");
}
}

当被点击后会进行signal_Request信号的事件派发   RequestSignal 通过注入获取

在RequestCommand中  我们service 通过注入获取  然后对他进行了signal_succesd信号的监听

public class RequestCommand : Command
{
[Inject]
public IService service { get; set; }
public override void Execute()
{
Retain();
service.signal_succesd.AddListener(OnComplete);
service.Request();
}
void OnComplete()
{
service.signal_succesd.RemoveListener(OnComplete);
Debug.Log("get data finish"); Release();
} }

既然添加了监听 那么肯定有地方会进行成功后的信号派发    在TestService 中  我们对成功的信号进行派发

public class TestService : IService
{
[Inject(ContextKeys.CONTEXT_VIEW)]
public GameObject contextView { get; set; }
[Inject]
public SuccessSignal signal_succesd { get; set; } public void Request()
{
contextView.GetComponent<MonoBehaviour>().StartCoroutine(Wait());
}
/// <summary>
/// 模拟网络请求延迟1秒
/// </summary>
/// <returns></returns>
IEnumerator Wait()
{
yield return new WaitForSeconds();
signal_succesd.Dispatch();
}
}

这样  我们就实现了信号的机制  信号也是官方推荐的方法

Unity StrangeIoc框架 (三)signal信号方式的更多相关文章

  1. Unity StrangeIoC框架

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

  2. Unity StrangeIoc框架 (一)

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

  3. Unity StrangeIoc框架 (二)

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

  4. unity StrangeIoc

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

  5. SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序

    SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论   异常汇总:http://www ...

  6. 2019年6月14日 Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)

    摘要 MTV与MVC 多对多表三种创建方式 ajax ,前后端传输数据编码格式contentType 批量插入数据和自定义分页器 一.MVC与MTV MVC(Model View Controller ...

  7. Django框架(十)--ORM多对多关联关系三种创建方式、form组件

    多对多的三种创建方式 1.全自动(就是平常我们创建表多对多关系的方式) class Book(models.Model): title = models.CharField(max_length=32 ...

  8. pureMVC与strangeIoc框架对比

    前言 最近有机会了解到了StrangeIoc框架,就拿来跟自己比较熟悉的pureMVC进行一下简要的对比.这两套开源框架都是基于MVC模式的扩展,pureMVC是一个跨平台跨语言的MVC轻量级应用框架 ...

  9. Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介

    约定 还记得上版本的第二十四篇的约定嘛?现在出来履行啦~ 为什么要重制? 之前写的专栏都是按照心情写的,在最初的时候笔者什么都不懂,而且文章的发布是按照很随性的一个顺序.结果就是说,大家都看完了,都还 ...

随机推荐

  1. 用事件与CSS改变按钮不同状态下的颜色

    目标效果: 表单的群发按钮,在鼠标悬停时为深蓝色,鼠标离开时为淡蓝色. HTML代码: <button id="submitBtn"  class="btn&quo ...

  2. 让ie支持placeholder属性,一段js搞定

    placeholder属性真的是超级好用的新属性,可惜,只有新版浏览器才支持,为了写出输入框贴心提示,老方法就是加span标签覆盖,营造出placeholder提示的感觉,现在安利一款好用的js,好用 ...

  3. JS原型,Prototype,原型

    对于javascript这样一种前端语言,个人觉得,要真正的理解其oop, 就必须要彻底搞清楚javascript的对象,原型链,作用域,闭包,以及this所引用的对象等概念.这些对弄明白了,应该就可 ...

  4. iOS7、iOS8推送通知的区别

    iOS8版本以后的推送通知代码[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificati ...

  5. DOM缘起

    DOM是现在按W3C标准的浏览器均实现的标准.HTML.CSS.DOM共同在结构.表现.交互上共同支撑起一个页面.当然,必须以用户为中心.平稳退化.逐渐增强.DOM的操作是通过JS来实现的.JS最初在 ...

  6. malloc和free的区别

    1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存. 2,对于非内部数据类型的对象而言,光用maloc/free无法满足动 ...

  7. Java Eclipse常规设置

    改变字体大小 eclipse英文版中如何去修改字体及方法?首先打开eclipse中,按下面的方法即可菜单项:window ->preferences -> general -> ap ...

  8. objective -c こだわり

    You make an object by creating an instance of a particular class. You do this by allocating the obje ...

  9. SQLSERVER 使用WITH函数查找时间点最大数据行

      --表结构及数据: DTIME TYPE MONEY 2015-10-14 13:50:35.000 shopping 20 2015-10-21 13:51:24.000 shopping 40 ...

  10. Cloning Java objects using serialization

    Sometimes you need to clone objects, and sometimes you can't use their clone method, and sometimes s ...