Unity QFrameWork--IOC
IOCContainer
using System; using System.Collections.Generic; namespace QFramework{ public class IOCContainer { /// <summary> /// 存储实例 /// </summary> public Dictionary<Type, object> mInstances = new Dictionary<Type, object>(); /// <summary> /// 注册class /// </summary> /// <typeparam name="T"></typeparam> /// <param name="instances"></param> public void Register<T>(T instances){ var key = typeof(T); if(mInstances.ContainsKey(key)){ mInstances[key] = instances; } else{ mInstances.Add(key, instances); } } /// <summary> /// 获取实例 没有则返回null /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public T Get<T>() where T : class { var key = typeof(T); if(mInstances.TryGetValue(key,out var retObj)){ return retObj as T; } return null; } } }
代码解释
IOCContainer 是一个简单的依赖注入容器,用于存储和管理对象的实例。
mInstances 是一个字典,用于存储注册的实例。
Key:Type 类型,表示对象的类型。
Value:object 类型,表示对象的实例。
通过类型(Type)来查找对应的实例。
Register函数是将一个实例注册到容器中。
例如
var container = new IOCContainer(); container.Register(new MyService());
Get函数从容器中获取指定类型的实例。
例如
var myService = container.Get<MyService>(); if (myService != null) { myService.DoSomething(); }
用法说明
IOCContainer是和Singleton一起使用,实现单例的集中管理。
定义单例类
public class MyManager : Singleton<MyManager> { private MyManager() { } // 私有构造函数 public void DoSomething() { Console.WriteLine("Doing something..."); } }
注册单例实例
var container = new IOCContainer(); container.Register(MyManager.Instance); // 注册单例实例
获取单例实例
var myManager = container.Get<MyManager>(); if (myManager != null) // 如果是null说明前面没有注册 { myManager.DoSomething(); }
结合后的优势
- 集中管理:通过 IOCContainer 集中管理所有单例实例,避免散落在代码各处。
- 依赖注入:可以通过 IOCContainer 实现依赖注入,解耦对象的创建和使用。
- 灵活性:可以动态注册和替换实例,方便测试和扩展。
下面是示例
using System; using System.Collections.Generic; namespace QFramework { public class MyManager : Singleton<MyManager> { private MyManager() { } public void DoSomething() { Console.WriteLine("Doing something..."); } } class Program { static void Main(string[] args) { var container = new IOCContainer(); container.Register(MyManager.Instance); // 注册单例实例 var myManager = container.Get<MyManager>(); // 获取单例实例 if (myManager != null) { myManager.DoSomething(); } } } }
合集:
QFramework
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通