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();}}}
}