Khi sử dụng workflow, việc truyền dữ liệu giữa các bước (step) là rất quan trọng. Dưới đây là một ví dụ về cách tạo một workflow để tính tích của hai số thông qua việc truyền dữ liệu.
Bước 1: Tạo lớp để truyền dữ liệu (CalculationData)
public class CalculationData {
public int Number1 { get; set; }
public int Number2 { get; set; }
public int Result { get; set; }
}
Bước 2: Tạo StepBody để thực hiện phép nhân (MultiplyStep)
public class MultiplyStep : StepBody {
public int Factor1 { get; set; }
public int Factor2 { get; set; }
public int Product { get; set; }
public override ExecutionResult Run(IStepExecutionContext context) {
Product = Factor1 * Factor2;
return ExecutionResult.Next();
}
}
Bước 3: Tạo StepBody để hiển thị kết quả (DisplayResultStep)
public class DisplayResultStep : StepBody {
public string DisplayMessage { get; set; }
public override ExecutionResult Run(IStepExecutionContext context) {
Console.WriteLine(DisplayMessage);
return ExecutionResult.Next();
}
}
Bước 4: Xây dựng workflow (CalculationWorkflow)
public class CalculationWorkflow : IWorkflow<CalculationData> {
public string Id => "CalculationWorkflow";
public int Version => 1;
public void Build(IWorkflowBuilder<CalculationData> builder) {
builder
.StartWith(context => {
Console.WriteLine("Bắt đầu workflow...");
return ExecutionResult.Next();
})
.Then<MultiplyStep>()
.Input(step => step.Factor1, data => data.Number1)
.Input(step => step.Factor2, data => data.Number2)
.Output(data => data.Result, step => step.Product)
.Then<DisplayResultStep>()
.Input(step => step.DisplayMessage, data => $"Kết quả phép nhân {data.Number1} * {data.Number2} = {data.Result}")
.Then(context => {
Console.WriteLine("Hoàn thành workflow!");
return ExecutionResult.Next();
});
}
}
Bước 5: Khởi chạy workflow từ controller
public class WorkflowController : Controller {
private readonly IServiceProvider _serviceProvider;
public WorkflowController(IServiceProvider serviceProvider) {
_serviceProvider = serviceProvider;
}
public IActionResult StartWorkflow() {
var host = _serviceProvider.GetService<IWorkflowHost>();
host.RegisterWorkflow<CalculationWorkflow, CalculationData>();
host.Start();
var inputData = new CalculationData {
Number1 = 50,
Number2 = 200
};
host.StartWorkflow("CalculationWorkflow", 1, inputData);
Console.ReadLine();
host.Stop();
return Json(new { status = "success" });
}
}