添加了自述文件

This commit is contained in:
fengjiayi
2024-08-06 19:39:28 +08:00
parent cc5f825513
commit 2ca5b3120b
3 changed files with 61 additions and 8 deletions

View File

@@ -7,6 +7,12 @@
<BaseOutputPath>D:\Project\C#\DynamicControl\SereinFlow\.Output</BaseOutputPath>
</PropertyGroup>
<ItemGroup>
<Compile Remove="bin\**" />
<EmbeddedResource Remove="bin\**" />
<None Remove="bin\**" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Library\Serein.Library.csproj" />
</ItemGroup>

View File

@@ -1,7 +1,54 @@
# 自述
基于WPFDotnet 8的流程可视化编辑器需二次开发。Bilibili个人空间https://space.bilibili.com/33526379不定期更新相关的视频。
一款基于WPFDotnet 8的流程可视化编辑器需二次开发
# 如何加载我的DLL
使用 **DynamicFlow** 特性标记你的类,可以参照 **MyDll****SereinWAT** 的实现。编译为 Dll文件 后,拖入到软件中即可。
B站个人空间https://space.bilibili.com/33526379
# 如何让我的方法成为节点?
使用 **MethodDetail** 特性标记你的方法。
* 动作节点 - Action
* 触发器节点 - Flipflop
![image](https://github.com/fhhyyp/serein-flow/blob/main/%E6%95%88%E6%9E%9C%E5%9B%BE.png)
# 关于 DynamicNodeType 枚举的补充说明。
## 1. 不生成节点控件的枚举值:
* **Init - 初始化方法**
* 入参:**DynamicContext**(有且只有一个参数)。
* 返回值:自定义,但软件目前不支持接收返回值。
* 描述在运行时首先被调用。语义类似于构造方法。建议在Init方法内初始化类、注册类等一切需要在构造函数中执行的方法。
* **Loading - 加载方法**
* 入参:**DynamicContext**(有且只有一个参数)。
* 返回值:自定义,但软件目前不支持接收返回值。
* 描述当所有Dll的Init方法调用完成后首先调用、也才会调用DLL的Loading方法。建议在Loading方法内进行业务上的初始化例如启动Web启动第三方服务
* **Exit - 结束方法**
* 入参:**DynamicContext**(有且只有一个参数)。
* 返回值:自定义,但软件目前不支持接收返回值。
* 描述:当结束/手动结束运行时会调用所有Dll的Exit方法。使用场景类似于终止内部的其它线程通知其它进程关闭例如停止第三方服务。
## 2. 基础节点
* 待更新
## 3. 从DLL生成控件的枚举值
* **Action - 动作**
* 入参自定义。如果传入DynamicContext会传入当前的上下文如果传入NodeBase会传入节点对应的Model。第一个非[Explicit]特性的参数会尝试从上一节点的获取FlowData变量并根据当前入参类型尝试进行类型转换。
* 返回值自定义返回值由对应的Model类的[object?]FlowData变量接收。
* 描述:同步执行对应的方法。
* **Flipflop - 触发器**
* 全局触发器
* 入参依照Action节点。
* 返回值Task<FlipflopContext>
* 描述运行开始时所有无上级节点的触发器节点在当前分支中作为起始节点分别建立新的线程运行然后异步等待触发如果有。这种触发器拥有独自的DynamicContext上下文共用同一个Ioc执行完成之后会重新从分支起点的触发器开始等待。
* 分支中的触发器
* 入参依照Action节点。
* 返回值Task<FlipflopContext>
* 描述:接收上一节点传递的上下文,同样进入异步等待,但执行完成后不会再次等待自身(只会触发一次)。
* FlipflopContext
* 描述内部有一套枚举描述Succeed、Cancel如果返回Succeed会通过所有下级节点集合创建Task集合然后调用WaitAll()进行等待每个Task会新建新的DynamicContext上下文共用同一个Ioc。如果返回Cancel则什么也不做。
* 使用场景配合TcsSignal<TEnum>使用定时从PLC中获取状态当某个变量发生改变时会通知持有TaskCompletionSource的触发器如果需要可以传递对应的数据。
演示:
![image](https://github.com/fhhyyp/serein-flow/blob/cc5f8255135b96c6bb3669bc4aa8d8167a71c262/Image/%E6%BC%94%E7%A4%BA%20-%201.png)
![image](https://github.com/fhhyyp/serein-flow/blob/cc5f8255135b96c6bb3669bc4aa8d8167a71c262/Image/%E6%BC%94%E7%A4%BA%20-%202.png)

View File

@@ -11,7 +11,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Serein.Library", "Library\S
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Serein.Module.WAT", "SereinWAT\Serein.Module.WAT.csproj", "{C2F68A15-5D07-4418-87C0-E7402DD9F83A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Serein.NodeFlow", "NodeFlow\Serein.NodeFlow.csproj", "{5C8444EB-A8D6-48BE-915D-82A585B93F2E}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Serein.NodeFlow", "NodeFlow\Serein.NodeFlow.csproj", "{7B51A19A-88AB-471E-BCE3-3888C67C936D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -35,10 +35,10 @@ Global
{C2F68A15-5D07-4418-87C0-E7402DD9F83A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C2F68A15-5D07-4418-87C0-E7402DD9F83A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C2F68A15-5D07-4418-87C0-E7402DD9F83A}.Release|Any CPU.Build.0 = Release|Any CPU
{5C8444EB-A8D6-48BE-915D-82A585B93F2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5C8444EB-A8D6-48BE-915D-82A585B93F2E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5C8444EB-A8D6-48BE-915D-82A585B93F2E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5C8444EB-A8D6-48BE-915D-82A585B93F2E}.Release|Any CPU.Build.0 = Release|Any CPU
{7B51A19A-88AB-471E-BCE3-3888C67C936D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7B51A19A-88AB-471E-BCE3-3888C67C936D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7B51A19A-88AB-471E-BCE3-3888C67C936D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7B51A19A-88AB-471E-BCE3-3888C67C936D}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE