有关DSL和WorkflowCore.DSL
一、DSL
在编程领域中,DSL即 Domain Specific Language (特定域语言),是一种特定于特定问题领域的计算机语言,设计用于解决该领域的特定类型的问题 。
HTML是DSL的一个典型,它是在Web应用上使用的语言,尽管HTML无法进行数字运算,但也不影响它在这方面的广泛应用。
从WorkflowCore.DSL引用的包中,
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="SharpYaml" Version="1.6.5" />
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.3.0" />
可看出它主要是解决JSON或YAML格式转换的问题。
从 JSON 或 YAML 加载工作流定义
<PackageReference Include="WorkflowCore.DSL" Version="3.13.0" />
var services = new ServiceCollection();
services.AddLogging(c =>
{
c.SetMinimumLevel(LogLevel.Debug);
c.AddConsole();
});
services.AddWorkflow();
# 使用 WorkflowCore.DSL
services.AddWorkflowDSL();
var sp = Ioc.Default = services.BuildServiceProvider();
var loggerFactory = sp.GetRequiredService<ILoggerFactory>();
var host = sp.GetRequiredService<IWorkflowHost>();
#region 方法1:直接代码中注册 (当不使用DSL时使用)
host.RegisterWorkflow<HelloworldWorkflow, HelloParam>();
#endregion
或
var loader = sp.GetRequiredService<IDefinitionLoader>();
#region 方法2:从JSON加载
loader.LoadDefinition(File.ReadAllText("json1.json"), Deserializers.Json);
#endregion
或
#region 方法3:从YAML加载
loader.LoadDefinition(File.ReadAllText("yaml1.yaml"), Deserializers.Yaml);
#endregion
host.Start();
await host.StartWorkflow("HelloworldWorkflow", new HelloParam { });
Console.ReadLine();
host.Stop();
json1.json
{
"Id": "HelloworldWorkflow",
"Version": 1,
"Steps": [
{
"Id": "Hello",
"StepType": "DemoWorkflowCore.Models.HelloStepBody, DemoWorkflowCore",
"NextStepId": "End"
},
{
"Id": "End",
"StepType": "DemoWorkflowCore.Models.EndStepBody, DemoWorkflowCore"
}
]
}
yaml1.yaml
Id: HelloworldWorkflow
Version: 1
Steps:
- Id: Hello
StepType: DemoWorkflowCore.Models.HelloStepBody, DemoWorkflowCore
NextStepId: End
- Id: End
StepType: DemoWorkflowCore.Models.EndStepBody, DemoWorkflowCore
二、WorkflowCore.DSL
Workflow
- Id
- Version
- Description
- Steps
Step
- Id
- StepType
- NextStepId
- Inputs - (key/value)
- Outputs - (key/value)
- CancelCondition
StepType 格式:<类名>, <程序集>
Inputs 的key如果以’@'开头,value可为Expression表达式
Inputs的Expression中可以使用环境变量。environment[“变量名”]
转换过程
先
json/yaml : string ----> DefinitionSourceV1 ------------> WorkflowDefinition
|--> ICollection<StepSourceV1> -->|
然后,使用RegisterWorkflow方法注册WorkflowDefinition。