StrangeIOCLearn

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
	}
	
	
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		}
	





}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值