WorkflowCore 編寫與設計

一、workflowcore請假

WorkflowCore 作為一個基於 .NET Core 平台上的分散式流程處理框架,不僅支持 SQL Server 執行流程,還可以將內存數據持久化至 Redis、RabbitMQ、MongoDB 等第三方數據存儲中心。它能夠方便地為請假申請等一些列企業級業務提供處理方案。

下面是一個例子,展示了一個請假過程的 WorkflowCore 代碼片段:

public class LeaveWorkflow : IWorkflow
{
    public string Id => "leave";

    public int Version => 1;

    public void Build(IWorkflowBuilder builder)
    {
        builder
            .StartWith(context => ExecutionResult.Next())
            .While(data => ((LeaveData)data).IsNeedLeave, whileBuilder =>
            {
                whileBuilder
                    .Do(then => then.StartWith()
                                     .Output(data => ((LeaveData)data).ApprovalResult, step => step.Result)
                                     .Then("IsLeaveApproved",
                                           conditionBuilder => conditionBuilder
                                                                     .When(data => ((LeaveData)data).ApprovalResult, true)
                                                                     .Then("Approved",
                                                                           thenBuilder => thenBuilder
                                                                                                     .Do(context => Console.WriteLine("Approved successfully."))
                                                                           )
                                                                     .When(data => !((LeaveData)data).ApprovalResult, true)
                                                                     .Then("Rejected",
                                                                           thenBuilder => thenBuilder
                                                                                                     .Do(context => Console.WriteLine("Rejected request."))
                                                                                 ));

            });
    }
}

public class ApplyLeave : StepBody
{
    public bool NeedLeave { get; set; }

    public DateTime StartTime { get; set; }

    public int DurationInDays { get; set; }

    public override ExecutionResult Run(IStepExecutionContext context)
    {
        Console.WriteLine("Applying leave...");
        var approvalResult = new Random().Next(1, 11) > 5;
        return ExecutionResult.Next(new LeaveData
        {
            IsNeedLeave = NeedLeave,
            StartTime = StartTime,
            DurationInDays = DurationInDays,
            ApprovalResult = approvalResult
        });
    }
}

public class LeaveData
{
    public bool IsNeedLeave { get; set; } = true;

    public DateTime StartTime { get; set; } = DateTime.Now;

    public int DurationInDays { get; set; } = 2;

    public bool ApprovalResult { get; set; }
}

二、workflowcore 書籍

為了更好地掌握 WorkflowCore 框架,需要一本詳細的書籍來指導我們學習它的使用方法。《Pro WorkflowCore》 是 John Resig、 Jeremy Ashkenas 和 Micha? Chodkowski-Janusz 編寫的一本流程自動化開發指南。

筆者在閱讀此書時,印象深刻之處在於其對實際業務場景的概述和分析,為我們理解 WorkflowCore 框架提供了了很好的指引。

三、workflowcore流程設計器

WorkflowCore 流程設計器為使用者提供了一種非常方便的方案,使流程的設計變得非常直觀。開發者可以利用工具手動繪製流程圖,或者自動生成流程步驟列表。

示例代碼片段如下:

var steps = new List();
steps.Add(nameof(FindDog));

var descriptor = new WorkflowDefinition()
    .StartWith()
    .Then(
        nameof(FindDog),
        data => data.DogToFind,
        step => step
            .Input(step => step.DogName, data => data.DogToFind)
            .Output(data => data.DogLocation, step => step.Result)
    )
    .Then(
        data => data.NotifyContact,
        step => step.Input(step => step.DogLocation, data => data.DogLocation)
    )
    .If(data => data.HasGivenUp,
        ifBuilder => ifBuilder
            .Do(then => then.StartWith())
            .Then(end => end
                .StartWith(
                    data => data.NotifyContact,
                    step => step.Input(step => step.Message, data => "Lost dog mode has been entered.")
                )
            ))
    .Then(a => a.StartWith());

var xml = new XmlWorkflowSerializer().Serialize(descriptor);

四、workflowcore設計

WorkflowCore 的開發過程相對比較簡單,它是開源框架,可以支持你快速編寫自己的業務代碼來實現各種流程形式。

為了製作自己的 WorkflowCore 進程,你可以從創建一個 Workflow 項目寫起:

  1. 安裝WorkflowCore Nuget 包。
  2. 在項目根目錄下添加一個與 Workflow 名稱一致的類,實現 IWorkflow 介面。
  3. 在 Workflow 類中使用 Workflow Builder 對象構建流程(起點和一系列步驟)。
  4. 在 Startup.ConfigureServices 方法中使用 WorkflowCore 並行添加 Workflow 服務。

下面是一個最簡化的 WorkflowCore 樣本代碼 :

public class SampleWorkflow : IWorkflow
{
    public string Id => "SampleWorkflow";

    public int Version => 1;

    public void Build(IWorkflowBuilder builder)
    {
        builder
            .StartWith(SayHello)
            .Then(DisplayMessage)
            .Then(End);
    }

    public void End(IStepExecutionContext context)
    {
        Console.WriteLine("Ending workflow...");
    }

    public ExecutionResult SayHello(IStepExecutionContext context)
    {
        Console.WriteLine("Hello World!");
        return ExecutionResult.Next();
    }

    public ExecutionResult DisplayMessage(IStepExecutionContext context)
    {
        Console.WriteLine(context.Workflow.Data.Message);
        return ExecutionResult.Next();
    }
}

public class MyDataClass
{
    public string Message { get; set; }
}

五、workflowcore 執行過程較長時間

WorkflowCore 的執行時間是相對較長的,主要是因為 Workflow 必須通過多個微服務來執行,在這個過程中,可能需要將數據存儲到資料庫中,與第三方系統交互,並啟動其他服務。

因此,在使用 WorkflowCore 時,要注意對任務進行分割和非同步處理。

六、workflowcore 設計器

WorkflowCore 的設計器使得開發人員能夠在可視化的界面中更方便地 mockup 流程。這個設計器還支持添加一系列的步驟,包括 if/else 語句,分支和循環。

下面是一個 WorkflowCore 設計器的示例代碼:

  var design = new WorkflowDesign
  {
    Inputs = new[]
    {
        new WorkflowInput
        {
            Key = "intputOne",
            Label = "Input Number One",
            Type = VariableType.Number
        }
    },
    Steps = new[]
    {
        new WorkflowStep
        {
            Id = "stepOne",
            Label = "Add Two",
            Inputs = new []
            {
                new WorkflowInputMapping
                {
                    SourceKey = "inputOne",
                    DestinationKey = "intOne"
                },
                new WorkflowInputMapping
                {
                    SourceKey = "stepTwoResult",
                    DestinationKey = "intTwo"
                }
            },
            Outputs = new []
            {
                new WorkflowOutputMapping
                {
                    SourceKey = "result",
                    DestinationKey = "stepOneResult"
                }
            },
            Settings = new WorkflowStepSettings
            {
                Type = "SampleType"
            }
        },
        new WorkflowStep
        {
            Id = "stepTwo",
            Label = "Increment",
            Outputs = new []
            {
                new WorkflowOutputMapping
                {
                    SourceKey = "result",
                    DestinationKey = "stepTwoResult"
                }
            }
        }
    }
};

七、workflowcore實戰

WorkflowCore 可以被用於各種負載流程,包括需求審批流程、訂單和應用程序服務管理流程、甚至是調度生產設備的自動化流程等。

以下即是一個現實與實踐密切相關的 WorkflowCore 示例代碼:

public class SampleWorkflow : IWorkflow
{
    public string Id => "SampleWorkflow";

    public int Version => 1;

    public void Build(IWorkflowBuilder builder)
    {
        builder
            .StartWith()
                .Output(data => data.Value1, step => step.Value1)
                .Output(data => data.Value2, step => step.Value2)
            .Then()
                .Input(step => step.Value1, data => data.Value1)
                .Input(step => step.Value2, data => data.Value2)
                .Output(data => data.Result, step => step.Result)
            .Then()
                .Input(step => step.Response, data => data.Result);
    }
}

public class MyDataClass
{
    public int Value1 { get; set; }

    public int Value2 { get; set; }

    public int Result { get; set; }
}

public class ReadData : StepBody
{
    public int Value1 { get; set; }

    public int Value2 { get; set; }

    public override ExecutionResult Run(IStepExecutionContext context)
    {
        Value1 = 2;
        Value2 = 5;
        return ExecutionResult.Next();
    }
}

public class CalculateSum : StepBody
{
    public int Value1 { get; set; }

    public int Value2 { get; set; }

    public int Result { get; set; }

    public override ExecutionResult Run(IStepExecutionContext context)
    {
        Result = Value1 + Value2;
        return ExecutionResult.Next();
    }
}

public class SendData : StepBody
{
    public int Response { get; set; }

    public override ExecutionResult Run(IStepExecutionContext context)
    {
        Console.WriteLine($"The result is: {Response}");
        return ExecutionResult.Next();
    }
}

八、workflowcore 圖形化

WorkflowCore 支持圖形化工具,可以將流程設計轉化為一個流程定義 XML 文件。圖形化工具使得我們能夠更快地創建和修改我們的流程,同時也方便團隊協作與溝通,並檢測流程的正確性。

下面是一個 WorkflowCore 圖形化工具設計的代碼:

var def = new ProcessDefinition
{
    Id = "MyFirstWF",
    Steps = new List
    {
        new ProcessStep
        {
            Id = "step1",
            Name = "My First Step",  
            Type = StepType.Task,
            Data = new Dictionary
            {
                {"TaskName", "My Task"}
            }
        },
        new ProcessStep
        {
            Id = "step2",
            Name = "My Second Step",
            Type = StepType.Control,
            Descendants = new List
            {
                "step3"
            },
            Data = new Dictionary
            {
                {"ControlFlowType", ControlFlowType.FullCondition}
            }
        },
        new ProcessStep
        {
            Id = "step3",
            Name = "My Third Step",
            Type = StepType.Task,
            Data = new Dictionary
            {
                {"TaskName", "My Task 2"}
            }
        }
    }
};

var design = WorkflowDesignerParser.Parse(def);

九、workflowcore多人審批

WorkflowCore 可以用於多人審批流程,這個過程就像簡單的順序審批過程一樣,流程將會被視為改變狀態的一系列步驟,每個步驟都由一個負責人來執行,然後再由其它人員來查看和審核。

示例代碼如下:

public class ApprovalWorkflow : IWorkflow
{
public string Id => "ApprovalWorkflow";

public int Version => 1;

public void Build(IWorkflowBuilder builder)
{
builder
.StartWith(context => ExecutionResult.Next())
.Then()
.Input(step => step.Signature, data => $"{data.Approver}: Approved")
.Output(data => data.Signatures, step => (step.Signature, step.Name))
.ForEach(data => data.Reviewers, iteration => iteration
.Do(branch => branch
.StartWith()
.Input(step => step.Request, data => $"Please review {data.DocumentName}")
.Input(step => step.Requester, data => data.Requester)
.Then(context =>
{
Console.WriteLine($"Request sent to {context.Workflow.Id}");
return ExecutionResult.Next();
})
)
.While(data => !data.Appro

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/179941.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-22 05:10
下一篇 2024-11-22 05:10

發表回復

登錄後才能評論