龙空技术网

将工作流引擎与 .NET Core 的集成

opendotnet 649

前言:

当前朋友们对“net core工作流引擎”大概比较关切,各位老铁们都需要剖析一些“net core工作流引擎”的相关资讯。那么小编也在网摘上搜集了一些关于“net core工作流引擎””的相关知识,希望各位老铁们能喜欢,你们快快来了解一下吧!

工作流引擎是用于自动化、管理和协调复杂业务流程的强大工具。工作流程可视化只是其众多功能之一,有助于设计和理解工作流程。但是,它的主要功能是确保流程顺利、高效地运行并按照预定规则进行。

数据库设置

我们将使用的数据库是 SQL Server。在这里,我将它安装到 docker 中。使用以下命令。

docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=0p4BtZ4EJg' -p 1433:1433 --name rdb -d mcr.microsoft.com/mssql/server:2019-latest

由于这里我们使用的是 SQL Server,因此请下载 OptimaJet.Workflow.DbPersistence 文件夹。您可以根据您使用的数据库进行调整。转到 SQL 文件夹,然后解压 CreatePersistenceObjects.sql 文件。之后,打开 DBeaver 并创建与之前创建的数据库的连接。如果是这样,请导入 sql 文件并运行脚本。然后,将创建一个表,供工作流引擎使用。

应用程序开发

在 Visual Studio 中创建一个空白解决方案项目,并添加一个类库类型的项目,此处我将其命名为 WorkflowLibrary。

安装下面的两个库。

创建一个 WorkflowInit 类并提供以下代码。这满足了 Workflow Runtime 的需求。

using System;

using System.Xml.Linq;

using OptimaJet.Workflow.Core.Builder;

using OptimaJet.Workflow.Core.Bus;

using OptimaJet.Workflow.Core.Runtime;

using OptimaJet.Workflow.DbPersistence;

namespace WorkflowLibrary

{

public static class WorkflowInit

{

private static readonly Lazy<WorkflowRuntime> LazyRuntime = new Lazy<WorkflowRuntime>(InitWorkflowRuntime);

public static WorkflowRuntime Runtime

{

get { return LazyRuntime.Value; }

}

public static string ConnectionString { get; set; }

private static WorkflowRuntime InitWorkflowRuntime()

{

// TODO Uncomment for .NET Framework if you don't set ConnectionString externally.

//ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

if (string.IsOrEmpty(ConnectionString))

{

throw new Exception("Please init ConnectionString before calling the Runtime!");

}

// TODO If you have a license key, you have to register it here

//WorkflowRuntime.RegisterLicense("your license key text");

// TODO If you are using database different from SQL Server you have to use different persistence provider here.

var dbProvider = new MSSQLProvider(ConnectionString);

var builder = new WorkflowBuilder<XElement>(

dbProvider,

new OptimaJet.Workflow.Core.Parser.XmlWorkflowParser(),

dbProvider

).WithDefaultCache();

var runtime = new WorkflowRuntime()

.WithBuilder(builder)

.WithPersistenceProvider(dbProvider)

.EnableCodeActions()

.SwitchAutoUpdateSchemeBeforeGetAvailableCommandsOn()

.AsSingleServer();

var plugin = new OptimaJet.Workflow.Plugins.BasicPlugin();

// Settings for SendEmail actions

// plugin.Setting_Mailserver = "smtp.yourserver.com";

// plugin.Setting_MailserverPort = 25;

// plugin.Setting_MailserverFrom = "from@yourserver.com";

// plugin.Setting_MailserverLogin = "login@yourserver.com";

// plugin.Setting_MailserverPassword = "pass";

// plugin.Setting_MailserverSsl = true;

runtime.WithPlugin(plugin);

// events subscription

runtime.ProcessActivityChanged += (sender, args) => { };

runtime.ProcessStatusChanged += (sender, args) => { };

// TODO If you have planned to use Code Actions functionality that required references to external assemblies

// you have to register them here

//runtime.RegisterAssemblyForCodeActions(Assembly.GetAssembly(typeof(SomeTypeFromMyAssembly)));

// starts the WorkflowRuntime

// TODO If you have planned use Timers the best way to start WorkflowRuntime is somewhere outside

// of this function in Global.asax for example

runtime.Start();

return runtime;

}

}

}

之后,创建一个 ASP.NET Core MVC 类型的新项目,这里我将其命名为 Designer。

右键单击项目,然后选择 add > project reference(添加项目引用),然后选择 WorkflowLibrary,以便可以在 Designer 项目中使用它。

右键单击 Controller 文件夹,然后选择 add > controller。然后右键单击 view() 方法并单击 add view。然后选择 Razor View — Empty。

之后,将之前创建的 Controller 更改为以下代码。

using System.Collections.Specialized;

using System.Text;

using Microsoft.AspNetCore.Mvc;

using OptimaJet.Workflow;

using WorkflowLibrary;

namespace DesignerApp.Controllers

{

public class DesignerController : Controller

{

public IActionResult Index()

{

return View();

}

[Obsolete]

public async Task<IActionResult> Api()

{

Stream? filestream = ;

var isPost = Request.Method.Equals("POST", StringComparison.OrdinalIgnoreCase);

if (isPost && Request.Form.Files != && Request.Form.Files.Count > 0)

filestream = Request.Form.Files[0].OpenReadStream();

var pars = new NameValueCollection();

foreach (var q in Request.Query)

{

pars.Add(q.Key, q.Value.First());

}

if (isPost)

{

var parsKeys = pars.AllKeys;

//foreach (var key in Request.Form.AllKeys)

foreach (string key in Request.Form.Keys)

{

if (!parsKeys.Contains(key))

{

pars.Add(key, Request.Form[key]);

}

}

}

(string res, bool hasError) = await WorkflowInit.Runtime.DesignerAPIAsync(pars, filestream);

var operation = pars["operation"]?.ToLower();

if (operation == "downloadscheme" && !hasError)

return File(Encoding.UTF8.GetBytes(res), "text/xml");

else if (operation == "downloadschemebpmn" && !hasError)

return File(UTF8Encoding.UTF8.GetBytes(res), "text/xml");

return Content(res);

}

}

}

转到以下页面并下载 workflowdesigner.min.css 和 workflowdesigner.min.js 文件。

将文件复制到 wwwroot 文件夹并将其放在相应的文件夹中。

转到 appsettings.json 并将连接配置添加到数据库。

"ConnectionStrings": { 

"DefaultConnection": "Server=localhost,1433;Database=workflowdb;User Id=sa;Password=0p4BtZ4EJg;TrustServerCertificate=True;"

},

将连接配置添加到 Program.cs 并将其分配给 WorkflowInit.ConnectionString 字段。

WorkflowInit.ConnectionString = app.Configuration.GetConnectionString("DefaultConnection");

将下面的 list 元素添加到共享 > _Layout.cshtml >视图,以便可以访问工作流引擎。

<li class="nav-item">

<a class="nav-link text-dark" asp-area="" asp-controller="Designer" asp-action="Index">Workflow Designer</a>

</li>

运行应用程序并访问该地址。

如果出现,则工作流引擎集成过程已完成。感谢您阅读我的文章。希望它有用。

如果你喜欢我的文章,请给我一个赞!谢谢

标签: #net core工作流引擎