using GFramework.Core.Abstractions.Rule;
using GFramework.Core.Abstractions.Systems;
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