侧边栏

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();
}
}
}
}
posted @   Z-wzy  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示
电磁波切换