using GFramework.Core.Abstractions.rule; using GFramework.Core.Abstractions.system; using Microsoft.Extensions.DependencyInjection; namespace GFramework.Core.Abstractions.ioc; /// /// 依赖注入容器接口,定义了服务注册、解析和管理的基本操作 /// public interface IIocContainer : IContextAware { #region Register Methods /// /// 注册单例 /// 一个类型只允许一个实例 /// /// 要注册为单例的类型 /// 要注册的单例实例 /// 当该类型已经注册过单例时抛出异常 void RegisterSingleton(T instance); /// /// 注册单例服务,指定服务类型和实现类型 /// 创建单例实例并在容器中注册 /// /// 服务接口或基类类型 /// 具体的实现类型 void RegisterSingleton() where TImpl : class, TService where TService : class; /// /// 注册瞬态服务,指定服务类型和实现类型 /// 每次解析时都会创建新的实例 /// /// 服务接口或基类类型 /// 具体的实现类型 void RegisterTransient() where TImpl : class, TService where TService : class; /// /// 注册作用域服务,指定服务类型和实现类型 /// 在同一作用域内共享实例,不同作用域使用不同实例 /// /// 服务接口或基类类型 /// 具体的实现类型 void RegisterScoped() where TImpl : class, TService where TService : class; /// /// 注册多个实例 /// 将实例注册到其实现的所有接口和具体类型上 /// /// 要注册的实例 public void RegisterPlurality(object instance); /// /// 注册多个实例 /// 将实例注册到其实现所有接口 /// /// 要注册的实例类型 public void RegisterPlurality() where T : class; /// /// 注册系统实例,将其绑定到其所有实现的接口上 /// /// 系统实例对象 void RegisterSystem(ISystem system); /// /// 注册指定类型的实例到容器中 /// /// 要注册的实例类型 /// 要注册的实例对象,不能为null void Register(T instance); /// /// 注册指定类型的实例到容器中 /// /// 要注册的实例类型 /// 要注册的实例对象 void Register(Type type, object instance); /// /// 注册工厂方法来创建服务实例 /// 通过委托函数动态创建服务实例 /// /// 服务类型 /// 创建服务实例的工厂委托函数 void RegisterFactory(Func factory) where TService : class; /// /// 注册中介行为管道 /// 用于配置Mediator框架的行为拦截和处理逻辑 /// /// 行为类型,必须是引用类型 void RegisterMediatorBehavior() where TBehavior : class; /// /// 配置服务 /// /// 服务配置委托 void ExecuteServicesHook(Action? configurator = null); #endregion #region Get Methods /// /// 获取单个实例(通常用于具体类型) /// 如果存在多个,只返回第一个 /// /// 期望获取的实例类型 /// 找到的第一个实例;如果未找到则返回 null T? Get() where T : class; /// /// 根据指定类型获取单个实例 /// 如果存在多个,只返回第一个 /// /// 期望获取的实例类型 /// 找到的第一个实例;如果未找到则返回 null object? Get(Type type); /// /// 获取指定类型的必需实例 /// /// 期望获取的实例类型 /// 找到的唯一实例 /// 当没有注册实例或注册了多个实例时抛出 T GetRequired() where T : class; /// /// 获取指定类型的必需实例 /// /// 期望获取的实例类型 /// 找到的唯一实例 /// 当没有注册实例或注册了多个实例时抛出 object GetRequired(Type type); /// /// 获取指定类型的所有实例(接口 / 抽象类推荐使用) /// /// 期望获取的实例类型 /// 所有符合条件的实例列表;如果没有则返回空数组 IReadOnlyList GetAll() where T : class; /// /// 获取指定类型的所有实例 /// /// 期望获取的实例类型 /// 所有符合条件的实例列表;如果没有则返回空数组 IReadOnlyList GetAll(Type type); /// /// 获取并排序(系统调度专用) /// /// 期望获取的实例类型 /// 比较器委托,定义排序规则 /// 按指定方式排序后的实例列表 IReadOnlyList GetAllSorted(Comparison comparison) where T : class; /// /// 获取指定类型的所有实例,并按优先级排序 /// 实现 IPrioritized 接口的服务将按优先级排序(数值越小优先级越高) /// 未实现 IPrioritized 的服务将使用默认优先级 0 /// /// 期望获取的实例类型 /// 按优先级排序后的实例列表 IReadOnlyList GetAllByPriority() where T : class; /// /// 获取指定类型的所有实例,并按优先级排序 /// 实现 IPrioritized 接口的服务将按优先级排序(数值越小优先级越高) /// 未实现 IPrioritized 的服务将使用默认优先级 0 /// /// 期望获取的实例类型 /// 按优先级排序后的实例列表 IReadOnlyList GetAllByPriority(Type type); #endregion #region Utility Methods /// /// 检查容器中是否包含指定类型的实例 /// /// 要检查的类型 /// 如果容器中包含指定类型的实例则返回true,否则返回false bool Contains() where T : class; /// /// 判断容器中是否包含某个具体的实例对象 /// /// 待查询的实例对象 /// 若容器中包含该实例则返回true,否则返回false bool ContainsInstance(object instance); /// /// 清空容器中的所有实例 /// void Clear(); /// /// 冻结容器,防止后续修改 /// 调用此方法后,容器将变为只读状态,不能再注册新的服务实例 /// void Freeze(); /// /// 获取底层的服务集合 /// 提供对内部IServiceCollection的访问权限,用于高级配置和自定义操作 /// /// 底层的IServiceCollection实例 IServiceCollection GetServicesUnsafe { get; } /// /// 创建一个新的服务作用域 /// 作用域内的 Scoped 服务将共享同一实例 /// /// 服务作用域实例 IServiceScope CreateScope(); #endregion }