Strang IOC框架:
07000700ABAB
MVCS框架。
依赖注入和控制反转其实就是同一个事情。
控制反转是一个对象如何获取他所依赖的对象的引用。
Strang -》 实现间接绑定
{
Context 定义程序边界
Binding : 存储对象的绑定关系。
Binder : 存储Binding对象
Context: 自展机制
https://www.jianshu.com/p/af9ac9ecf469
https://www.cnblogs.com/unityzc/p/6182584.html
https://www.cnblogs.com/designyourdream/p/4477101.html
https://zhuanlan.zhihu.com/p/25957663
View
Mediator : View 显示。 Mediator响应。逻辑。
Model :Model层 数据部分
Command :Control层 负责执行逻辑代码
Service : Service层: 负责第三方交互。
Dispatcher: 派发信息。 框架内通信主线的一种。
Signal : 强类型 绑定信号和命令
ReflectionBinder : 反射部分: 通过binding来获取类的信息
injector: 注入器: 通过反射获取的信息来实例化请求的对象。
public class : MonoBehavior
{
void OnDie()
{
dispatcher.Disaptch(GameEvent.SHIP_DEAD);
}
}
//默认写法: 使用dispatcher派发信号
injectionBinder.Bind().To().ToSingleton()
}
StrangeIOC
{
1. 框架启动点
public class Demo1ContexView:ContexView
{
void Awake()
{
//开启框架
this.context = new Demo1ContexView(this);
}
}
2. Context
using strange.extensions.context.impl;
using strange.extensions.context.api;
//主要做绑定使用,包括MVCS和一个StartCommand命令的绑定。
public class Demo1Contex:MVCSContext
{
public Demo1Contex(MonoBehavior view):base(view)
{}
protected override void mapBindings()
{
//model
//模型数据绑定为单例模式
injectionBinder.Bind<ScoreModel>().ToSingleton();
//service
//绑定接口具体实现的类 单例模式
injectionBinder.Bind<IScoreSevices>().To<ScoreServices>.toSingleton();
//command
//绑定事件命令 把一个命令和一个枚举类型进行绑定
commandBinder.Bind(Demo1CommandEvent.RequestScore).To<RequestScoreCommand>();
//dispatcher这个命令时,UpdateScoreCommand里面的Execute方法会执行
command.Bind(Demo1CommandEvent.UpdateScore).To<UpdateScoreCommand>();
//mediator 中介
mediationBinder.Bind<CubeView>().To<CubeMediator>(); //视图和中间层绑定
//绑定一个StartCommand事件 框架中定义的开始命令 。Once -》 只执行一次后解绑
commandBinder.Bind(Context.START).To<StartCommand>().Once();
}
3.Mediator 中介
public class CubeMediator: EventMediator
{
[inject] -> 对一个属性进行注入。 注入后StrangeIOC会自动对这个属性进行赋值。目的时减少层与层之间的交互
//注入cubeView
public CubeView cubeView{get;set;}
//view 创建 mediator 就会创建 这个方法就会执行
public override void OnRegister()
{
cubeView.Init();
//给事件添加监听 以及回调函数
dispatcher.AddListener(Demo1MediatorEvent.ScoreChange,OnScoreChange);
cubeView.dispatcher.AddListener(Demo1MediatorEvent.ClickDown,UpdateScore);
dispatcher.Disaptch(Demo1CommandEvent.RequestScore);
}
//销毁View时执行
public override void OnRemove()
{
debug.Log("OnRemove");
dispatcher.RemoveListener(Demo1MediatorEvent.ScoreChange,OnScoreChange);
cubeView.dispatcher.RemoveListener(Demo1MediatorEvent.ClickDown,UpdateScore)
}
}
4.Command 命令
public class RequestScoreCommand: EventCommand{
[Inject]
public IScoreSevices scoreServices{get;set;}
[Inject]
public ScoreModel scoreModel{get;set;}
public override void Execute()
{
Retain(); //保证这个命令不会被销毁
scoreServices.dispatcher.AddListener(DemoServicesEvent.RequestScore,OnComplete);
scoreServices.RequestScore("http://xxx/xxx/xxx");
}
private void OnComplete(IEvent evt)
{
debug.Log("request score complete" + evt.data);
scoreModel.Score = (int)evt.data; //
dispatcher.Disaptch(Demo1MediatorEvent.ScoreChange,evt.data);
scoreServices.dispatcher.RemoveListener(DemoServicesEvent.RequestScore,OnComplete);
Relese(); //释放
}
}
using strange.extensions.mediation.impl;
5.View 类 视图类
public class CubeView:View
{
[Inject]
//局部的dispatchar 在对应的mediator中绑定回调方法
public IEventDispatcher dispatcher{get;set;}
public Text scoreText;
public void Init()
{
scoreText = GetComponentInChildren<Text>();
}
//自身移动
void Update()
{
this.transform.Translate(new Vector3(Random.Range(-1, 2), Random.Range(-1, 2), Random.Range(-1, 2)) * 0.2f);
}
void OnMouseDown()
{
Debug.Log("OnMouseDown");
//触发事件
dispatcher.Disaptch(Demo1MediatorEvent.ClickDown);
}
public void UpdateScore(int score)
{
scoreText.text = score.ToString();
}
}
6.Service类
public interface IScoreSevices
{
void RequestScore(string url); //请求分数
void OnReceieveScore(); //收到分数
void UpdateScore(string url,int score) //更新分数
IEventDispatcher dispatcher{get;set;}
}
//IScoreSevices接口的一种实现
public class ScoreServices:IScoreSevices
{
public void RequestScore(string url)
{
Debug.Log("Request score services : " + url);
OnReceieveScore();
}
private OnReceieveScore()
{
int score = Random.Rang(0,100);
dispatcher.Disaptch(Demo1ServicesEvent.RequestScore,score);
}
public void UpdateScore(string url,int score)
{
Debug.Log("Update the score : " + url + "new score" + score);
}
[Inject]
public IEventDispatcher dispatcher{get;set;}
}
7.Model 保存本地数据
Public class ScoreModel
{
public int Score{get;set;}
}
8.自定义的事件: 用于dispatchar派发事件
public enum Demo1CommandEvent
{
RequestScore,
UpdateScore
}
}
}
}