using System; using System.Collections.Generic; using System.Threading.Tasks; namespace StandardScene.Chained { /// /// 可用于区分 Delivery 各生命周期事件的枚举。 /// public enum DeliveryEventType { OnStart, DoneFetch, DonePut, DoneMission, Failed, OnTerminated } /// /// 全局任务回调注册表:通过 (事件类型, key) 注册/解析各阶段回调,便于持久化和恢复。 /// public static class DeliveryCallbackRegistry { private static readonly Dictionary<(DeliveryEventType, string), Delegate> _callbacks = new(); private static void RegisterInternal(DeliveryEventType type, string key, Delegate callback) { if (string.IsNullOrWhiteSpace(key) || callback == null) return; _callbacks[(type, key)] = callback; } private static T ResolveInternal(DeliveryEventType type, string key) where T : class { if (key == null) return null; return _callbacks.TryGetValue((type, key), out var d) ? d as T : null; } public static void RegisterOnStart(string key, Action callback) => RegisterInternal(DeliveryEventType.OnStart, key, callback); public static void RegisterDoneFetch(string key, Action callback) => RegisterInternal(DeliveryEventType.DoneFetch, key, callback); public static void RegisterDonePut(string key, Action callback) => RegisterInternal(DeliveryEventType.DonePut, key, callback); public static void RegisterDoneMission(string key, Action callback) => RegisterInternal(DeliveryEventType.DoneMission, key, callback); public static void RegisterFailed(string key, Action callback) => RegisterInternal(DeliveryEventType.Failed, key, callback); public static void RegisterOnTerminated(string key, Func> callback) => RegisterInternal(DeliveryEventType.OnTerminated, key, callback); public static Action ResolveOnStart(string key) => ResolveInternal>(DeliveryEventType.OnStart, key); public static Action ResolveDoneFetch(string key) => ResolveInternal>(DeliveryEventType.DoneFetch, key); public static Action ResolveDonePut(string key) => ResolveInternal>(DeliveryEventType.DonePut, key); public static Action ResolveDoneMission(string key) => ResolveInternal>(DeliveryEventType.DoneMission, key); public static Action ResolveFailed(string key) => ResolveInternal>(DeliveryEventType.Failed, key); public static Func> ResolveOnTerminated(string key) => ResolveInternal>>(DeliveryEventType.OnTerminated, key); } }