将工作流引擎与 .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.IsNullOrEmpty(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 = null;
            var isPost = Request.Method.Equals("POST", StringComparison.OrdinalIgnoreCase);
            if (isPost && Request.Form.Files != null && 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>

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

图片

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

引入地址 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值