重写了Emit构造委托的执行

This commit is contained in:
fengjiayi
2024-10-10 20:52:19 +08:00
parent ef96b353ac
commit 2d0f354895
17 changed files with 233 additions and 177 deletions

View File

@@ -4,7 +4,11 @@ using System;
namespace Serein.Library.Attributes
{
/// <summary>
/// 表示该属性为自动注入依赖项
/// <para>表示该属性为自动注入依赖项。</para>
/// <para>使用场景:构造函数中存在互相依赖的情况</para>
/// <para>例如ServiceA类构造函数中需要传入ServiceBServiceB类构造函数中也需要传入ServiceA</para>
/// <para>这种情况会导致流程启动时IOC容器无法注入构造函数并创建类型导致启动失败。</para>
/// <para>解决方法从ServiceA类的构造函数中移除ServiceB类型的入参将该类型更改为公开可见的可写属性成员ServiceB serviceB{get;set;},并在该属性上标记[AutoInjection]特性</para>
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public sealed class AutoInjectionAttribute : Attribute
@@ -25,8 +29,17 @@ namespace Serein.Library.Attributes
/// </summary>
FlowLoading,
}
/// <summary>
/// 表示该类自动注册(单例模式)
/// <para>启动流程时会将标记了该特性的类自动注册到IOC容器中从而无需手动进行注册绑定。</para>
/// <para>流程启动后IOC容器会进行5次注册绑定。</para>
/// <para>第1次注册绑定初始化所有节点所属的类[DynamicFlow]标记的类)。</para>
/// <para>第2次注册绑定※初始化所有[AutoRegister(Class=FlowInit)]的类。</para>
/// <para>第3次注册绑定调用所有Init节点后进行注册绑定。</para>
/// <para>第4次注册绑定※初始化所有[AutoRegister(Class=FlowLoading)]的类</para>
/// <para>第5次注册绑定调用所有Load节点后进行注册绑定。</para>
/// <para>需要注意的是在第1次进行注册绑定的过程中如果类的构造函数存在入参那么也会将入参自动创建实例并托管到IOC容器中。</para>
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public sealed class AutoRegisterAttribute : Attribute
@@ -39,7 +52,7 @@ namespace Serein.Library.Attributes
}
/// <summary>
/// 用来判断一个类是否需要注册并构建节点
/// <para>表示该类中存在节点信息</para>
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class DynamicFlowAttribute : Attribute
@@ -49,14 +62,21 @@ namespace Serein.Library.Attributes
Name = name;
Scan = scan;
}
/// <summary>
/// 补充名称,不影响运行流程
/// </summary>
public string Name { get; set; }
/// <summary>
/// 如果设置为false将忽略该类
/// </summary>
public bool Scan { get; set; } = true;
}
/// <summary>
/// 生成节点类型
/// <para>表示该方法将会生成节点,或是加入到流程运行中</para>
/// <para>如果是Task类型的返回值将会自动进行等待</para>
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class NodeActionAttribute : Attribute
@@ -71,10 +91,25 @@ namespace Serein.Library.Attributes
MethodTips = methodTips;
LockName = lockName;
}
/// <summary>
/// 如果设置为false时将不会生成节点信息
/// </summary>
public bool Scan;
/// <summary>
/// 类似于注释的效果
/// </summary>
public string MethodTips;
/// <summary>
/// 标记节点行为
/// </summary>
public NodeType MethodDynamicType;
/// <summary>
/// 显示标注方法返回类型,不影响运行逻辑(用于表示触发器触发后返回的数据)
/// </summary>
public Type ReturnType;
/// <summary>
/// 暂无意义
/// </summary>
public string LockName;
}