![]() |
VOOZH | about |
dotnet add package Msm.Core.MediatR --version 1.0.15
NuGet\Install-Package Msm.Core.MediatR -Version 1.0.15
<PackageReference Include="Msm.Core.MediatR" Version="1.0.15" />
<PackageVersion Include="Msm.Core.MediatR" Version="1.0.15" />Directory.Packages.props
<PackageReference Include="Msm.Core.MediatR" />Project file
paket add Msm.Core.MediatR --version 1.0.15
#r "nuget: Msm.Core.MediatR, 1.0.15"
#:package Msm.Core.MediatR@1.0.15
#addin nuget:?package=Msm.Core.MediatR&version=1.0.15Install as a Cake Addin
#tool nuget:?package=Msm.Core.MediatR&version=1.0.15Install as a Cake Tool
Một thư viện Workflow Engine mạnh mẽ được xây dựng theo Clean Architecture, hỗ trợ multi-tenancy và cung cấp đầy đủ các tính năng để quản lý quy trình phê duyệt và workflow phức tạp.
ContextData sang payload của hệ thống khác, mapping ngược response về kết quả workflow, và lưu trong ResultDataMsm.Module.Workflow), triển khai (Msm.Module.Workflow.Infrastructure), và HTTP (Msm.Module.Workflow.AspNetCore)Project được xây dựng theo Clean Architecture với 4 layers chính:
framework/module/Workflow/
├── Msm.Module.Workflow/ # Domain: entities, enums, exceptions (NuGet: Msm.Module.Workflow)
├── Msm.Module.Workflow.Infrastructure/ # MediatR, services, DTOs, EF Core (NuGet: …Infrastructure)
└── Msm.Module.Workflow.AspNetCore/ # REST controllers (NuGet: …AspNetCore)
AspNetCore → Infrastructure → Domain (Msm.Module.Workflow)
Nguyên tắc:
Msm.Core.Abstractions)Msm.Core.Persistence: contracts chuẩn cho IRepository<T> và IUnitOfWork.Msm.Core.EntityFrameworkCore.PostgreSql: implementation EF Core/Npgsql cho contracts ở trên.Msm.Core.EFCore: legacy API để tương thích ngược cho các service cũ; ưu tiên code mới theo 2 package phía trên để dễ maintain lâu dài.Xem chi tiết tại
git clone <repository-url>
cd msm-workflow-lib
dotnet restore
dotnet build
<PackageReference Include="Msm.Module.Workflow" Version="1.0.0" />
<PackageReference Include="Msm.Module.Workflow.Infrastructure" Version="1.0.0" />
<PackageReference Include="Msm.Module.Workflow.AspNetCore" Version="1.0.0" />
Sử dụng script build-packages.sh để build + pack theo từng nhóm:
cd msm-workflow-lib
# all groups: core + dynamic + workflow
./build-packages.sh 1.0.0 ./nupkg all
# chỉ build/pack Core packages
./build-packages.sh 1.0.0 ./nupkg core
# chỉ build/pack DynamicRecords packages
./build-packages.sh 1.0.0 ./nupkg dynamic
# chỉ build/pack Workflow packages
./build-packages.sh 1.0.0 ./nupkg workflow
Nếu không truyền group, mặc định là all.
Sau khi chạy xong, bạn sẽ thấy các file .nupkg và .snupkg trong thư mục nupkg/.
export NUGET_API_KEY=<YOUR_NUGET_API_KEY>
dotnet nuget push ./nupkg/*.nupkg \
--api-key "$NUGET_API_KEY" \
--source https://api.nuget.org/v3/index.json
Tạo file appsettings.json trong Infrastructure project:
{
"Database": {
"Host": "localhost",
"Port": "5432",
"Name": "msm_workflow",
"Username": "postgres",
"Password": "your_password"
}
}
cd framework/module/Workflow/Msm.Module.Workflow.Infrastructure
dotnet ef migrations add InitialCreate --startup-project .
dotnet ef database update --startup-project .
using Msm.Module.Workflow.Infrastructure;
using Msm.Module.Workflow.AspNetCore;
// Trong Program.cs hoặc Startup.cs
services.AddApplication();
services.AddInfrastructure(configuration);
services.AddWorkflowApiControllers();
[ApiController]
[Route("api/[controller]")]
public class MyController : ControllerBase
{
private readonly IWorkflowProcessService _processService;
private readonly IWorkflowInstanceService _instanceService;
public MyController(
IWorkflowProcessService processService,
IWorkflowInstanceService instanceService)
{
_processService = processService;
_instanceService = instanceService;
}
[HttpPost("create-process")]
public async Task<IActionResult> CreateProcess(CreateWorkflowProcessDto dto)
{
var process = await _processService.CreateProcessAsync(dto);
return Ok(process);
}
}
Xem chi tiết tại
var processDto = new CreateWorkflowProcessDto
{
Name = "Purchase Order Approval",
Code = "PO_APPROVAL",
ObjectType = "PURCHASE_ORDER",
Description = "Workflow for approving purchase orders",
EntryCriteria = "amount > 10000",
AllowSubmitterToRecall = true
};
var process = await _processService.CreateWorkflowProcessFromDtoAsync(processDto);
var stepDto = new CreateWorkflowStepDto
{
ProcessId = process.Id,
Name = "Manager Approval",
StepType = WorkflowStepType.Approval,
StepOrder = 1,
WorkflowBehavior = WorkflowBehavior.AllMustApprove,
ApprovalTimeoutDays = 1, // 1 day
TimeoutBehavior = TimeoutBehavior.Escalate
};
var step = await _processService.AddStepFromDtoAsync(process.Id, stepDto);
// Lấy process theo code trước
var process = await _processService.GetWorkflowProcessesAsync()
.FirstOrDefaultAsync(p => p.Code == "PO_APPROVAL");
var contextData = JsonDocument.Parse(JsonSerializer.Serialize(new
{
amount = 15000,
department = "IT"
}));
var instance = await _instanceService.SubmitWorkflowInstanceAsync(
workflowProcessId: process.Id,
targetRecordId: purchaseOrderId,
targetObjectType: "PURCHASE_ORDER",
submittedBy: currentUserId,
contextData: contextData
);
// instance.Status và instance.History cho biết trạng thái phê duyệt
Xem thêm ví dụ tại
Ví dụ một workflow dùng để validation Order trước khi lưu:
WorkflowProcess có Code = "ORDER_VALIDATION" và ObjectType = "ORDER", loại process là Validation.ExternalApiCall với ActionConfig:
WorkflowInstance.ContextData sang payload của API (qua UI Designer).WorkflowInstance.ResultData để trả lại cho caller.Khi tạo Order, hệ thống chỉ cần trigger workflow:
var contextData = JsonDocument.Parse(JsonSerializer.Serialize(new
{
orderId = orderId,
totalAmount = 1500000,
customerCode = "C001"
}));
var instance = await _instanceService.SubmitWorkflowInstanceAsync(
workflowProcessId: validationProcess.Id, // ORDER_VALIDATION
targetRecordId: orderId.ToString(),
targetObjectType: "ORDER",
submittedBy: currentUserId,
contextData: contextData
);
// Sau khi workflow chạy xong (các step validation tự động, không cần approver):
// - instance.Status: thành công/failed tùy theo logic validation
// - instance.Metadata / ResultData (tùy implement) chứa chi tiết lỗi/cảnh báo để hiển thị trên UI
Trong UI Designer, bạn có thể:
ExternalApiCall.Project bao gồm một React-based UI designer để thiết kế workflow trực quan:
cd Example/workflow-designer-ui
npm install
npm run dev
Truy cập tại http://localhost:5173
# Chạy tests (khi có)
dotnet test
# Build solution
dotnet build
# Restore packages
dotnet restore
Chúng tôi hoan nghênh mọi đóng góp! Vui lòng đọc để biết cách đóng góp.
[Specify your license here]
Lưu ý: Đây là version 1.0.0. API có thể thay đổi trong các phiên bản tương lai.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 was computed. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
Showing the top 3 NuGet packages that depend on Msm.Core.MediatR:
| Package | Downloads |
|---|---|
|
Msm.Module.Workflow.Application
Workflow module application layer: commands, queries, DTOs, contracts, and AutoMapper profiles. |
|
|
Msm.Module.Workflow.Infrastructure
Business services, handlers, and orchestration layer for the MSM workflow module. |
|
|
Msm.Core.AspNetCore
Shared ASP.NET Core middleware and helpers for MSM services. |
This package is not used by any popular GitHub repositories.