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;