namespace Guru { using UnityEngine; using System; using System.Collections.Generic; public class Context : IContext, IEventPipeline, IDisposable { protected ContextObject _contextObj; private EventBus _eventBus; private Dictionary _models; private Dictionary _controllers; private Dictionary _resManagers; private Dictionary _helpers; public static T Create (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(10); _controllers = new Dictionary(10); _resManagers = new Dictionary(10); _helpers = new Dictionary(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(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 manager, string name = "") where T : IResManager, new() { TryAddUpdater(manager); if (_resManagers.TryAdd(GetInstanceName(name), manager)) { manager.Context = this; return true; } return false; } public T GetResManager(string name = "") where T : IResManager, new() { return _resManagers.TryGetValue(GetInstanceName(name), out var m) ? (T)m : default(T); } /// /// 注册数据模型 /// /// /// /// public bool RegisterModel(T model, string name = "") where T : IModel, new() { TryAddUpdater(model); return _models.TryAdd(GetInstanceName(name), model); } public T GetModel(string name = "") where T : IModel, new() { return _models.TryGetValue(GetInstanceName(name), out var m) ? (T)m : default(T); } /// /// 注册辅助工具 /// /// /// /// /// public bool RegisterHelper(T helper, string name = "") where T : IHelper, new() { TryAddUpdater(helper); return _helpers.TryAdd(GetInstanceName(name), helper); } public T GetHelper(string name = "") where T : IHelper, new() { return _helpers.TryGetValue(GetInstanceName(name), out var m) ? (T)m : default(T); } /// /// 注册控制器 /// /// /// public bool RegisterController(T controller, string name = "") where T : IController, new() { TryAddUpdater(controller); if (_controllers.TryAdd(GetInstanceName(name), controller)) { controller.Context = this; return true; } return false; } public T GetController(string name = "") where T : IController, new() { return _controllers.TryGetValue(GetInstanceName(name), out var c) ? (T)c : default(T); } #endregion #region 事件管理 public void Subscribe(Action onReceiveMessage) where T : struct { _eventBus.Subscribe(onReceiveMessage); } public void Unsubscribe(Action onReceiveMessage) where T : struct { _eventBus.Unsubscribe(onReceiveMessage); } public void Send(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 } }