using System; namespace PCL.Core.App.IoC; /// /// 注册生命周期服务项,将由生命周期管理统一创建实例,然后在指定生命周期自动启动或加入等待手动启动列表。
/// 使用此注解的类型必须直接或间接实现 接口,否则将被忽略。 ///
/// 详见 [AttributeUsage(AttributeTargets.Class, Inherited = false)] public sealed class LifecycleServiceAttribute(LifecycleState startState) : Attribute { /// /// 指定该服务项应于何种生命周期状态启动。生命周期管理将在指定的状态按照 自动启动服务项。 /// public LifecycleState StartState { get; } = startState; /// /// 启动优先级。同一个生命周期状态有多个服务项需要启动时,将会按优先级数值降序启动,即数值越大越优先。
/// 虽然这个值可以为任意 32 位整数,但是非核心服务请勿使用较为极端的值,尤其是 /// int.MaxValue int.MinValue,这可能导致一些核心服务的启动时机出现问题。 ///
public int Priority { get; init; } = 0; } /// /// 标记一个注解,使其成为依赖收集器。
/// 使用被标记的注解标记的 类 与 /// 方法/属性 会被作为依赖收集到一个统一的存储位置,并用于运行时的依赖注入。 ///
/// 依赖标记 /// 目标,仅支持类、方法、属性,可以使用 | 分隔以添加多个目标 /// 依赖类型 [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] public sealed class DependencyCollectorAttribute(string identifier, AttributeTargets targets) : Attribute; /// /// 标记一个方法以自动生成注入操作,该方法需在 类中。
/// 自动生成的注入操作将收集依赖并调用该方法以注入,该方法第一个参数必须为依赖类型,其余参数需与对应依赖收集器匹配。 ///
/// 依赖标记 /// 是否在生命周期启动时自动执行注入 [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] public sealed class DependencyInjectionPointAttribute(string identifier, bool lifecycleAutoInvoke = true) : Attribute; /// /// 标记一个 partial 类,自动实现 接口,并基于其他有标记的方法生成 /// 方法 /// /// See /// See /// See [AttributeUsage(AttributeTargets.Class)] public sealed class LifecycleScopeAttribute(string identifier, string name, bool asyncStart = true) : Attribute; /// /// 标记一个 Start 方法,可以标记多个 /// [AttributeUsage(AttributeTargets.Method)] public sealed class LifecycleStartAttribute : Attribute; /// /// 标记一个 Stop 方法,可以标记多个 /// [AttributeUsage(AttributeTargets.Method)] public sealed class LifecycleStopAttribute : Attribute; /// /// 标记一个命令处理器,可以标记多个,将自动识别和处理方法参数。
/// 若方法的第一个参数类型为 则会传入指定指令的命令行模型。
/// 除命令行模型以外,任何参数在未显式声明默认值时均默认传入 值,请尽可能为所有参数提供显式默认值。
/// NOTE: 请勿使用异步实现,返回 Task 的方法将被直接忽略。
/// NOTE: 该方法可能在任意线程被调用,请注意线程上下文和同步问题。 ///

示例: /// /// [LifecycleCommandHandler("foo")] /// private static void _FooHandler(CommandLine model, string bar, bool flag) { /// // process logic... /// // argument example: foo --flag --bar blablabla /// } /// ///

/// 命令名 [AttributeUsage(AttributeTargets.Method)] public sealed class LifecycleCommandHandlerAttribute(string command) : Attribute; /// /// 标记一个依赖注入入口,可以标记多个。 ///

示例: /// /// [LifecycleDependencyInjection("some-property", AttributeTargets.Property)] /// private static void _LoadProperties(ImmutableList<(PropertyAccessor<string> prop, string name)> items) /// { /// // process logic... /// } /// [LifecycleDependencyInjection("some-method", AttributeTargets.Method)] /// private static void _LoadMethods(ImmutableList<(Action method, string name)> items) /// { /// // process logic... /// } /// ///

/// 依赖标识符 /// 依赖类型,可以使用 | 连接多个 [AttributeUsage(AttributeTargets.Method)] public sealed class LifecycleDependencyInjectionAttribute(string identifier, AttributeTargets targets) : Attribute;