using System.ComponentModel; using System.Reflection; using GFramework.Core.Abstractions.Rule; using GFramework.Core.Abstractions.Systems; 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; /// /// 注册 CQRS 请求管道行为。 /// /// 行为类型,必须是引用类型 void RegisterCqrsPipelineBehavior() where TBehavior : class; /// /// 注册 CQRS 请求管道行为。 /// 该成员保留旧名称以兼容历史调用点,内部行为与 一致。 /// 新代码不应继续依赖该别名;兼容层计划在未来的 major 版本中移除。 /// /// 行为类型,必须是引用类型 [EditorBrowsable(EditorBrowsableState.Never)] [Obsolete( "Use RegisterCqrsPipelineBehavior() instead. This compatibility alias will be removed in a future major version.")] void RegisterMediatorBehavior() where TBehavior : class; /// /// 从指定程序集显式注册 CQRS 处理器。 /// 该入口适用于处理器不位于默认架构程序集中的场景,例如扩展包、模块程序集或拆分后的业务程序集。 /// 运行时会优先使用程序集级源码生成注册器;若不存在可用注册器,则自动回退到反射扫描。 /// /// 包含 CQRS 处理器或生成注册器的程序集。 void RegisterCqrsHandlersFromAssembly(Assembly assembly); /// /// 从多个程序集显式注册 CQRS 处理器。 /// 容器会按稳定程序集键去重,避免默认启动路径与扩展模块重复接入同一程序集时产生重复 handler 映射。 /// /// 要接入的程序集集合。 void RegisterCqrsHandlersFromAssemblies(IEnumerable assemblies); /// /// 配置服务 /// /// 服务配置委托 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 }