前言:
当前朋友们对“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工作流引擎