using System;
using GFramework.Core.Abstractions.Architectures;
using GFramework.Core.Abstractions.Enums;
using GFramework.Core.Abstractions.Utility;
namespace GFramework.Core.Architectures;
///
/// 注册表初始化钩子抽象基类,简化注册表配置的初始化逻辑
///
/// 注册表类型
/// 配置类型
public abstract class RegistryInitializationHookBase : IArchitectureLifecycleHook
where TRegistry : class, IUtility
{
private readonly IEnumerable _configs;
private readonly ArchitecturePhase _targetPhase;
///
/// 初始化注册表初始化钩子
///
/// 配置集合
/// 目标执行阶段,默认为 AfterSystemInit
protected RegistryInitializationHookBase(
IEnumerable configs,
ArchitecturePhase targetPhase = ArchitecturePhase.AfterSystemInit)
{
_configs = configs;
_targetPhase = targetPhase;
}
///
/// 当架构进入指定阶段时触发的回调方法
///
/// 当前的架构阶段
/// 相关的架构实例
/// 为 。
///
/// 当目标注册表未被装入当前架构上下文时,该钩子会保持 no-op,
/// 以便同一组配置可以安全复用于不包含该注册表的测试或裁剪场景。
///
public void OnPhase(ArchitecturePhase phase, IArchitecture architecture)
{
ArgumentNullException.ThrowIfNull(architecture);
if (phase != _targetPhase)
{
return;
}
TRegistry registry;
try
{
registry = architecture.Context.GetUtility();
}
catch (InvalidOperationException)
{
return;
}
foreach (var config in _configs)
{
RegisterConfig(registry, config);
}
}
///
/// 注册单个配置项到注册表
///
/// 注册表实例
/// 配置项
protected abstract void RegisterConfig(TRegistry registry, TConfig config);
}