侧边栏

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 @ 2025-01-08 21:53  Z-wzy  阅读(52)  评论(0)    收藏  举报