194 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C#
		
	
	
| 
 | |
| namespace Guru
 | |
| {
 | |
|     using UnityEngine;
 | |
|     using System;
 | |
|     using System.Collections.Generic;
 | |
|     
 | |
|     
 | |
|     public class Context : IContext, IEventPipeline, IDisposable
 | |
|     {
 | |
|         protected ContextObject _contextObj;
 | |
|         private EventBus _eventBus;
 | |
|         private Dictionary<string, IModel> _models;
 | |
|         private Dictionary<string, IController> _controllers;
 | |
|         private Dictionary<string, IResManager> _resManagers;
 | |
|         private Dictionary<string, IHelper> _helpers;
 | |
| 
 | |
| 
 | |
|         public static T Create<T> (string name = "") where T : Context, new()
 | |
|         {
 | |
|             var context = new T();
 | |
|             context.Init();
 | |
|             return context;
 | |
|         }
 | |
| 
 | |
|         private void Init()
 | |
|         {
 | |
|             _contextObj = ContextObject.Create("guru_context");
 | |
|             _contextObj.OnDestroyed = OnDestroyHandler;
 | |
|             _contextObj.OnStart = OnStart;
 | |
|             
 | |
|             _eventBus = new EventBus();
 | |
|             _models = new Dictionary<string, IModel>(10);
 | |
|             _controllers = new Dictionary<string, IController>(10);
 | |
|             _resManagers = new Dictionary<string, IResManager>(10);
 | |
|             _helpers = new Dictionary<string, IHelper>(10);
 | |
| 
 | |
|             OnCreated();
 | |
|         }
 | |
| 
 | |
|         protected virtual void OnCreated()
 | |
|         {
 | |
|               
 | |
|         }
 | |
| 
 | |
|         protected virtual void OnStart()
 | |
|         {
 | |
|             
 | |
|         }
 | |
| 
 | |
| 
 | |
|         public virtual void Dispose()
 | |
|         {
 | |
|             
 | |
|         }
 | |
| 
 | |
|         private void OnDestroyHandler()
 | |
|         {
 | |
|             OnDestroyed();
 | |
|             Dispose();
 | |
|         }
 | |
| 
 | |
|         protected virtual void OnDestroyed()
 | |
|         {
 | |
|             
 | |
|         }
 | |
| 
 | |
|         #region 注册组件
 | |
| 
 | |
| 
 | |
|         private static string GetInstanceName<T>(string instName = "")
 | |
|         {
 | |
|             if(string.IsNullOrEmpty(instName)) instName = nameof(T);
 | |
|             return instName;
 | |
|         }
 | |
| 
 | |
|         private bool TryAddUpdater(object obj)
 | |
|         {
 | |
|             if (obj is IUpdater a)
 | |
|             {
 | |
|                 RegisterUpdater(a);
 | |
|                 return true;
 | |
|             }
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         public bool RegisterResManager<T>(T manager, string name = "") where T : IResManager, new()
 | |
|         {
 | |
|             TryAddUpdater(manager);
 | |
|             if (_resManagers.TryAdd(GetInstanceName<T>(name), manager))
 | |
|             {
 | |
|                 manager.Context = this;
 | |
|                 return true;
 | |
|             }
 | |
|             return false;
 | |
|         }
 | |
|         
 | |
|         public T GetResManager<T>(string name = "") where T : IResManager, new()
 | |
|         {
 | |
|             return _resManagers.TryGetValue(GetInstanceName<T>(name), out var m) ? (T)m : default(T);
 | |
|         }
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 注册数据模型
 | |
|         /// </summary>
 | |
|         /// <param instName="model"></param>
 | |
|         /// <param name="name"></param>
 | |
|         /// <typeparam instName="T"></typeparam>
 | |
|         public bool RegisterModel<T>(T model, string name = "") where T : IModel, new()
 | |
|         {
 | |
|             TryAddUpdater(model);
 | |
|             return _models.TryAdd(GetInstanceName<T>(name), model);
 | |
|         }
 | |
| 
 | |
|         public T GetModel<T>(string name = "") where T : IModel, new()
 | |
|         {
 | |
|             return _models.TryGetValue(GetInstanceName<T>(name), out var m) ? (T)m : default(T);
 | |
|         }
 | |
|         
 | |
|         /// <summary>
 | |
|         /// 注册辅助工具
 | |
|         /// </summary>
 | |
|         /// <param name="helper"></param>
 | |
|         /// <param name="name"></param>
 | |
|         /// <typeparam name="T"></typeparam>
 | |
|         /// <returns></returns>
 | |
|         public bool RegisterHelper<T>(T helper, string name = "") where T : IHelper, new()
 | |
|         {
 | |
|             TryAddUpdater(helper);
 | |
|             return _helpers.TryAdd(GetInstanceName<T>(name), helper);
 | |
|         }
 | |
| 
 | |
|         public T GetHelper<T>(string name = "") where T : IHelper, new()
 | |
|         {
 | |
|             return _helpers.TryGetValue(GetInstanceName<T>(name), out var m) ? (T)m : default(T);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 注册控制器
 | |
|         /// </summary>
 | |
|         /// <param instName="controller"></param>
 | |
|         /// <typeparam instName="T"></typeparam>
 | |
|         public bool RegisterController<T>(T controller, string name = "") where T : IController, new()
 | |
|         {
 | |
|             TryAddUpdater(controller);
 | |
|             if (_controllers.TryAdd(GetInstanceName<T>(name), controller))
 | |
|             {
 | |
|                 controller.Context = this;
 | |
|                 return true;
 | |
|             }
 | |
|             return false;
 | |
|         }
 | |
|         public T GetController<T>(string name = "") where T : IController, new()
 | |
|         {
 | |
|             return _controllers.TryGetValue(GetInstanceName<T>(name), out var c) ? (T)c : default(T);
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region 事件管理
 | |
| 
 | |
|         public void Subscribe<T>(Action<T> onReceiveMessage) where T : struct
 | |
|         {
 | |
|             _eventBus.Subscribe(onReceiveMessage);
 | |
|         }
 | |
| 
 | |
|         public void Unsubscribe<T>(Action<T> onReceiveMessage) where T : struct
 | |
|         {
 | |
|             _eventBus.Unsubscribe(onReceiveMessage);
 | |
|         }
 | |
| 
 | |
|         public void Send<T>(T message) where T : struct
 | |
|         {
 | |
|             _eventBus.Send(message);
 | |
|         }
 | |
|         
 | |
|         #endregion
 | |
| 
 | |
|         #region 更新挂载
 | |
| 
 | |
|         
 | |
|         public void RegisterUpdater(IUpdater updater)
 | |
|         {
 | |
|             _contextObj.AddUpdater(updater);
 | |
|         }
 | |
|         
 | |
|         public void UnregisterUpdater(IUpdater updater)
 | |
|         {
 | |
|             _contextObj.RemoveUpdater(updater);
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
|     }
 | |
| } |