亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

最近想做一個OA相關的網站開發,一直都聽說有workflow的東西,之前也斷斷續續學習過 Workflow Foundation 4.0,還是沒有搞明白到底能夠用它做什么

但還是覺得workflow在某種情形下應該可以適用,雖然還沒有答案,網上搜樓了一通,發現一個workflow-core的東西,覺得挺有意思,遂停下來,琢磨一下,現分享與大家。

* 簡介

workflow core的GitHub主頁

https://github.com/danielgerlag/workflow-core

如主頁上介紹的,workflow core作為一個輕量級workflow引擎,可以嵌入到項目中,其底層是用.NET standard 2.0開發,可以用來追蹤長時間運行的任務狀態,功能也比較強大,支持插件形式持久化,和多節點并行處理,貌似很牛。并且目前有給一個 Conductor 項目,就是使用workflow core作為內核的workflow服務器(原來運行workflow,需要單獨的一個服務器啊),Conductor這里就不展開了。workflow core支持fluent語法,寫起來也非常美觀,雖然沒有WF那樣有圖形化的操作界面,但感覺代碼比較干凈。

* 示例1

新建一個項目,指明使用.net framework 4.6.1以上,新建項目后,在Package Manager Console中,安裝workflow core:Install-Package WorkflowCore,安裝這個包會默認安裝一系列的依賴包

可能由于版本的關系,還需要另外安裝兩個包:Microsoft.Extensions.Logging 和 Microsoft.Extensions.Logging.Debug。這樣就可以按照Sample 01開始編寫代碼了

 

Sample01是一個helloworld,包含了幾部分內容:

1. 構建StepBody,就是workflow中需要執行的內容,每個類繼承自StepBody這個虛擬類,重載ExecutionResult Run(IStepExecutionContext context),這個函數中完成所需的工作

public class HelloWorld : StepBody    {        private ILogger logger;        public HelloWorld(ILoggerFactory loggerFactory)        {            logger = loggerFactory.CreateLogger<HelloWorld>();        }        public override ExecutionResult Run(IStepExecutionContext context)        {            Console.WriteLine("Hello world, workflow");            logger.LogInformation("Helloworld workflow");            return ExecutionResult.Next();        }    }    public class GoodbyeWorld : StepBody    {        private ILogger logger;        public GoodbyeWorld(ILoggerFactory loggerFactory)        {            logger = loggerFactory.CreateLogger<GoodbyeWorld>();        }        public override ExecutionResult Run(IStepExecutionContext context)        {            Console.WriteLine("Workflow, Goodbye");            logger.LogInformation("Goodbye workflow");            return ExecutionResult.Next();        }    }    public class SleepStep : StepBody    {        private ILogger logger;        public SleepStep(ILoggerFactory loggerFactory)        {            logger = loggerFactory.CreateLogger("SleepStep");        }        public override ExecutionResult Run(IStepExecutionContext context)        {            Thread.Sleep(1000);            logger.LogInformation("Sleeped");            return ExecutionResult.Next();        }    }

2. 構建workflow,實現IWorkflow接口,每個workflow有一個Id和一個Version,標明這個workflow的身份,這里通過兩種方法構建了HelloWorkflow

   public class HelloWorkflow : IWorkflow    {        public string Id => "HelloWorkflow";        public int Version => 1;        public void Build(IWorkflowBuilder<object> builder)        {            builder.StartWith(context =>            {                Console.WriteLine("Hello world");                return ExecutionResult.Next();            })            .Then(context =>            {                Thread.Sleep(500);                Console.WriteLine("sleeped");                return ExecutionResult.Next();            })            .Then(context =>            {                Console.WriteLine("Goodbye world");                return ExecutionResult.Next();            });        }    }    public class HelloWorkflow2 : IWorkflow    {        public string Id => "HelloWorkflow";        public int Version => 2;        public void Build(IWorkflowBuilder<object> builder)        {            builder.StartWith<HelloWorld>()                .Then<SleepStep>()                .Then<GoodbyeWorld>();        }    }

3. 萬事俱備,準備讓workflow運行起來。第一步當然是需要搭建service,Workflow Core通過Injection命名空間的ServiceCollection添加了Workflow相關的服務,對于有參數的StepBody,需要先通過service的AddTransient函數注冊,這樣才能正確的構造對象

/// <summary> /// 配置workflow /// </summary> /// <returns></returns> private IServiceProvider ConfigureServices() {     //setup dependency injection     IServiceCollection services = new ServiceCollection();     services.AddLogging();     services.AddWorkflow();     //services.AddWorkflow(x => x.UseMongoDB(@"mongodb://localhost:27017", "workflow"));     // 這些個構造函數帶參數的,需要添加到transient中     services.AddTransient<HelloWorld>();     services.AddTransient<GoodbyeWorld>();     services.AddTransient<SleepStep>();     var serviceProvider = services.BuildServiceProvider();     //config logging     var loggerFactory = serviceProvider.GetService<ILoggerFactory>();     loggerFactory.AddProvider(new DebugLoggerProvider());     return serviceProvider; }

接下來,啟動workflow 主機,并啟動一次workflow,將整個窗體代碼貼一下,這樣比較清晰

using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Logging;using Microsoft.Extensions.Logging.Console;using Microsoft.Extensions.Logging.Debug;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;using WorkflowCore.Interface;using WorkflowCore.Services;using WorkFlowCoreTest.MyWorkflow;namespace WorkFlowCoreTest{    /// <summary>    /// Interaction logic for MainWindow.xaml    /// </summary>    public partial class MainWindow : Window    {        IServiceProvider serviceProvider = null;        bool serviceStarted = false;        public MainWindow()        {            InitializeComponent();        }        private void StartWorkflow()        {            if (serviceProvider == null)            {                serviceProvider = ConfigureServices();                var host1 = serviceProvider.GetService<IWorkflowHost>();                host1.RegisterWorkflow<HelloWorkflow>();                host1.RegisterWorkflow<HelloWorkflow2>();            }            var host = serviceProvider.GetService<IWorkflowHost>();            var wd = host.Registry.GetDefinition("HelloWorkflow");            // 如果host啟動了,不能再次啟動,但沒有判斷方法            if (!serviceStarted)            {                host.Start();                serviceStarted = true;            }            // 啟動workflow工作流            host.StartWorkflow("HelloWorkflow", 1, data: null); //            //host.StartWorkflow("HelloWorkflow");//, 2, data: null, 默認會啟用版本高的        }        private void StopWorkflow()        {            var host = serviceProvider.GetService<IWorkflowHost>();            host.Stop();            serviceStarted = false;        }        /// <summary>        /// 配置workflow        /// </summary>        /// <returns></returns>        private IServiceProvider ConfigureServices()        {            //setup dependency injection            IServiceCollection services = new ServiceCollection();            services.AddLogging();            services.AddWorkflow();            //services.AddWorkflow(x => x.UseMongoDB(@"mongodb://localhost:27017", "workflow"));            // 這些個構造函數帶參數的,需要添加到transient中            services.AddTransient<HelloWorld>();            services.AddTransient<GoodbyeWorld>();            services.AddTransient<SleepStep>();            var serviceProvider = services.BuildServiceProvider();            //config logging            var loggerFactory = serviceProvider.GetService<ILoggerFactory>();            loggerFactory.AddProvider(new DebugLoggerProvider());            return serviceProvider;        }        private void startButton_Click(object sender, RoutedEventArgs e)        {            StartWorkflow();        }        private void stopButton_Click(object sender, RoutedEventArgs e)        {            StopWorkflow();        }    }}

就這樣一個簡單的Workflow Core例子就完成了,總體來說,還是很簡單,清晰的。

 

出處:

https://www.cnblogs.com/keep-study-to-die/p/12001408.html

 

版權申明:本文來源于網友收集或網友投稿,僅供學習交流之用,如果有侵權,請轉告版主或者留言,本人立即刪除。

分享到:
標簽:Workflow Core
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定