Elsa Core 是一个工作流库,可在任何 .NET Core 应用程序中执行工作流。 工作流不仅可以使用代码定义,还可以使用 JSON、YAML 或 XML 进行定义。
开始使用
按照 Elsa Workflows 文档网站上的入门说明进行操作。
路线图
版本 1.0
- 工作流调用程序
- 长时间运行的工作流
- 工作流即代码
- 工作流即数据
- 相关
- 持久性:CosmosDB、Entity Framework Core、MongoDB、YesSQL
- HTML5 工作流设计器 Web 组件
- ASP.NET 核心工作流仪表板
- JavaScript 表达式
- 液体表达
- 原始活动
- 控制流活动
- 工作流活动
- 计时器活动
- HTTP 活动
- 电子邮件活动
版本 2.0
- 服务总线消息传送
- 通用命令和事件活动
- 工作流主机 REST API
- 工作流主机 gRPC API
- 工作流服务器
- 活动收获
- 分布式托管支持(支持多节点环境)
- 本地化支持
- 工作流设计器 UI 改进
- 活动编辑器 UI 改进
版本 3.0
- 状态机
- 容器活动
工作流设计器
可以使用Elsa Designer进行可视化设计工作流,Elsa Designer是一个使用StencilJS构建的可重用和可扩展的HTML5 Web组件。 为了管理工作流定义和实例,Elsa 附带了一个可重用的 Razor 类库,该库以 MVC 区域的形式提供了一个仪表板应用程序,您可以将其包含在自己的 ASP.NET Core 应用程序中。
编程工作流
可以通过编程方式创建工作流,然后使用 .IWorkflowInvoker
世界您好
以下代码片段演示如何从代码创建包含两个自定义活动的工作流,然后调用它:
// Define a strongly-typed workflow.
public class HelloWorldWorkflow : IWorkflow
{
public void Build(IWorkflowBuilder builder)
{
builder
.StartWith<HelloWorld>()
.Then<GoodByeWorld>();
}
}
// Setup a service collection.
var services = new ServiceCollection()
.AddWorkflows()
.AddActivity<HelloWorld>()
.AddActivity<GoodByeWorld>()
.BuildServiceProvider();
// Invoke the workflow.
var invoker = services.GetService<IWorkflowInvoker>();
await invoker.InvokeAsync<HelloWorldWorkflow>();
// Output:
// /> Hello World!
// /> Goodbye cruel World...
坚持
工作流几乎可以使用任何存储机制来持久化。 将支持以下提供程序:
- 在内存中
- 文件系统
- SQL 服务器
- MongoDB的
- CosmosDB
格式
目前,工作流可以存储在 YAML 或 JSON 格式。 下面演示了分别以 YAML 和 JSON 表示的简单工作流:
长时间运行的工作流
Elsa 对长时间运行的工作流提供原生支持。一旦工作流因某些阻塞活动而停止,该工作流就会保留。 当发生相应的事件时,将从存储中加载工作流并恢复。
为什么选择 Elsa 工作流程?
Elsa 的主要目标之一是以最少的工作量和最大的可扩展性在任何 .NET 应用程序中启用工作流。 这意味着将工作流功能集成到您自己的应用程序中应该很容易。
Azure 逻辑应用怎么样?
尽管 Azure 逻辑应用功能强大且完整,但它仅作为 Azure 中的托管服务提供。另一方面,Elsa 不仅允许您在 Azure 上托管它,还允许您在任何支持 .NET Core 的云提供商上托管它。当然,您可以在本地托管它。
虽然可以使用逻辑应用实现长时间运行的工作流,但通常将工作流与多个逻辑应用拆分,其中一个工作流调用另一个逻辑应用。这可能会使逻辑流程有点难以遵循。 使用 Elsa,您只需在工作流程中的任何位置添加触发器,从而更轻松地全面了解您的应用程序逻辑。如果需要,您仍然可以从一个工作流中调用其他工作流。
Windows Workflow Foundation 怎么样?
我一直很喜欢 Windows Workflow Foundation,但不幸的是,开发似乎已经停止了。 尽管正在努力将 WF 移植到 .NET Standard,但我更喜欢 Elsa 有几个原因:
- Elsa 本质上支持触发事件,以易于使用的方式启动新工作流并恢复已停止的工作流实例。例如: 将启动和恢复以 . 开头或以 .
workflowHost.TriggerWorkflowAsync("HttpRequestTrigger");"
HttpRequestTrigger
- Elsa 有一个基于 Web 的工作流设计器。我曾经为一个客户做过一个项目,该项目正在构建一个巨大的SaaS平台。其中一项要求是提供工作流引擎和基于 Web 的编辑器。尽管有商业工作流库和编辑器,但商业模式需要开源软件。我们使用了 WF 和重新托管的工作流设计器。它奏效了,但不是很好。
果园工作流程怎么样?
Orchard 和 Orchard Core 都附带了强大的工作流模块,两者都很棒。 事实上,Elsa Workflows是从Orchard Core的工作流模块中获取和改编的。Elsa 使用类似的模型,但存在一些差异:
- Elsa Workflows 与 Web 完全分离,而 Orchard Core Workflows 不仅与 Web 耦合,而且与 Orchard Core Framework 本身耦合。
- Elsa Workflows 可以在任何 .NET Core 应用程序中执行,而无需依赖任何 Orchard Core 包。
特征
下面列出了 Elsa 的一些主要功能:
- 小巧、简单、快速。该库应该是精益的,这意味着它应该易于使用,快速执行,并且易于通过自定义活动进行扩展。
- 调用任意工作流,就好像它们是我的应用程序的函数一样。
- 触发事件,使相应的工作流根据该事件自动启动/恢复。
- 支持长时间运行的工作流。当工作流执行并遇到需要用户输入的活动时,工作流将停止、保留并耗尽内存,直到需要恢复。这可能是几秒钟后,几分钟,几小时,几天甚至几年。
- 将工作流与特定于应用程序的数据相关联。这是长时间运行的工作流的关键要求。
- 以基于文件的格式存储工作流,以便我可以将其作为源代码管理的一部分。
- 将工作流存储在数据库中,而我不想让它们成为源代码管理的一部分。
- 基于 Web 的设计师。无论我是将工作流存储在文件系统还是数据库中,也无论我是在线托管设计器还是仅在本地计算机上托管设计器,我都需要能够编辑我的工作流。
- 使用表达式配置工作流活动。通常,工作流处理的信息本质上是动态的,活动需要一种与这些信息交互的方式。工作流表达式允许这样做。
- 可通过特定于应用程序的活动、自定义存储和脚本引擎进行扩展。
- 调用其他工作流。这允许从各种工作流中调用可重用的应用程序逻辑。就像从 C# 调用通用函数一样,无需重复代码。
- 查看和分析已执行的工作流实例。我想查看工作流采用的路径、运行时状态、故障位置以及补偿故障工作流。
- 将基于 Web 的工作流设计器嵌入到我自己的仪表板应用程序中。这使我可以选择创建运行所有应用程序逻辑的单个工作流主机,还可以选择在单个微服务中托管工作流运行时(允许编排和编排)。
- 关注点分离:工作流核心库、运行时和设计器都应分开。即,当工作流主机不应依赖于基于 Web 的设计器时。例如,这允许人们实现基于桌面的设计器,或者根本不使用设计器,而只使用 YAML 文件。最终,主机只需要工作流定义和对持久性存储的访问。
- 在本地或在云中托管 - 这两种方案都受支持,因为 Elsa 只是从应用程序引用的一组 NuGet 包。
如何使用艾尔莎
Elsa 作为一组 NuGet 包分发,因此可以轻松添加到应用程序中。 使用 Elsa 时,您通常需要至少拥有两个应用程序:
- 用于承载工作流设计器的 ASP.NET Core 应用程序。
- 执行工作流的 .NET 应用程序
设置工作流设计器 ASP.NET 核心应用程序
TODO:描述添加包和注册服务的所有步骤。
设置工作流宿主 .NET 应用程序
TODO:描述添加包和注册服务的所有步骤。
构建和运行 Elsa Workflows 仪表板
为了在本地计算机上构建和运行Elsa,请按照下列步骤操作:
- 克隆存储库。
- 运行 NPM install on
src\dashboard\Elsa.Dashboard\Theme\argon-dashboard
- 从目录执行
gulp build
src\dashboard\Elsa.Dashboard\Theme\argon-dashboard
- 打开 shell 并导航到并运行 。
src\dashboard\Elsa.Dashboard.Web
dotnet run
- 导航到 http://localhost:22174/elsa/home