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

浙公网安备 33010602011771号