因为是有关Command和Service的事件,所以将事件枚举命名为
public enum SMCubeEvent {
GetPositionComplete
}先看Service层吧
//接口
using strange.extensions.dispatcher.eventdispatcher.api;
public interface IPositionServise {
[Inject]
IEventDispatcher dispatcher { get; set; }
void GetPosition();
}//实现
using strange.extensions.context.api;
using strange.extensions.dispatcher.eventdispatcher.api;
public class LinePositionServise : IPositionServise
{
[Inject]
public CubePositionModel DataModel { get; set; }
[Inject]//局部的分发器
public IEventDispatcher dispatcher { get; set; }
public void GetPosition()
{
//假装是远程获取的数据
Vector3 pos = new Vector3(Random.Range(0, 2), Random.Range(0, 2), Random.Range(0, 2));
//保存数据到Model
DataModel.pos = pos;
//获取到后通知Command层回调
dispatcher.Dispatch(SMCubeEvent.GetPositionComplete,pos);
}
}然后是Command层
using strange.extensions.command.impl;
using strange.extensions.dispatcher.eventdispatcher.api;
public class CubeInitCommand : EventCommand {
[Inject]//注入服务层,用来调用事先准备好的接口
public IPositionServise PositionServise { get; set; }
public override void Execute ()
{
Retain();//保持Command不被销毁,因为服务层获取数据一般都不是立刻的
PositionServise.dispatcher.AddListener(SMCubeEvent.GetPositionComplete, OnComplete);
//通过服务层获取数据
PositionServise.GetPosition();
}
private void OnComplete(IEvent evt) {
dispatcher.RemoveListener(SMCubeEvent.GetPositionComplete, OnComplete);
//发送命令给Mediator,初始化位置
dispatcher.Dispatch(MCCubeEvent.InitPositionComplete, (Vector3)evt.data);
Release();//释放掉,放置内存泄漏
}
}总结:这个的交互和View-Mediator有点相像。在Command中获得Service的注入,直接调用接口来交互它,Command中通过注入的Service的局部dispatcher来监听它请求数据的完成回调,当Service层发出相应的请求完成事件,Command中的回调自然被触发。不同的是,因为Service层一般是用来和网络交互的,也就是说它提供的接口是有延迟性的,而Command是完成就会被销毁的,所以要用Retain()来保持Coammand不被销毁,事件完成后在手动销毁Release()。