El núcleo de flujo de trabajo es un motor de flujo de trabajo integral de peso ligero que orienta el estándar .NET. Piense: procesos de ejecución larga con múltiples tareas que necesitan rastrear el estado. Admite proveedores de persistencia y concurrencia conectables para permitir grupos de múltiples nodos.
El conductor es un servidor de flujo de trabajo independiente en lugar de una biblioteca que utiliza el núcleo de flujo de trabajo internamente. Expone una API que le permite almacenar definiciones de flujo de trabajo, rastrear los flujos de trabajo en ejecución, administrar eventos y definir pasos y scripts personalizados para su uso en sus flujos de trabajo.
https://github.com/danielgerlag/conductor
Ver tutorial aquí.
Defina sus flujos de trabajo con la API fluida.
public class MyWorkflow : IWorkflow
{
public void Build ( IWorkflowBuilder < MyData > builder )
{
builder
. StartWith < Task1 > ( )
. Then < Task2 > ( )
. Then < Task3 > ( ) ;
}
} Definir sus flujos de trabajo en JSON o YAML, necesita instalar WorkflowCore.dsl
{
"Id" : " HelloWorld " ,
"Version" : 1 ,
"Steps" : [
{
"Id" : " Hello " ,
"StepType" : " MyApp.HelloWorld, MyApp " ,
"NextStepId" : " Bye "
},
{
"Id" : " Bye " ,
"StepType" : " MyApp.GoodbyeWorld, MyApp "
}
]
} Id : HelloWorld
Version : 1
Steps :
- Id : Hello
StepType : MyApp.HelloWorld, MyApp
NextStepId : Bye
- Id : Bye
StepType : MyApp.GoodbyeWorld, MyApp public class MyData
{
public string Email { get ; set ; }
public string Password { get ; set ; }
public string UserId { get ; set ; }
}
public class MyWorkflow : IWorkflow
{
public void Build ( IWorkflowBuilder < MyData > builder )
{
builder
. StartWith < CreateUser > ( )
. Input ( step => step . Email , data => data . Email )
. Input ( step => step . Password , data => data . Password )
. Output ( data => data . UserId , step => step . UserId )
. Then < SendConfirmationEmail > ( )
. WaitFor ( "confirmation" , data => data . UserId )
. Then < UpdateUser > ( )
. Input ( step => step . UserId , data => data . UserId ) ;
}
} public class MyWorkflow : IWorkflow
{
public void Build ( IWorkflowBuilder < MyData > builder )
{
builder
. StartWith < CreateCustomer > ( )
. Then < PushToSalesforce > ( )
. OnError ( WorkflowErrorHandling . Retry , TimeSpan . FromMinutes ( 10 ) )
. Then < PushToERP > ( )
. OnError ( WorkflowErrorHandling . Retry , TimeSpan . FromMinutes ( 10 ) ) ;
}
} builder
. StartWith < LogStart > ( )
. Saga ( saga => saga
. StartWith < Task1 > ( )
. CompensateWith < UndoTask1 > ( )
. Then < Task2 > ( )
. CompensateWith < UndoTask2 > ( )
. Then < Task3 > ( )
. CompensateWith < UndoTask3 > ( )
)
. OnError ( Models . WorkflowErrorHandling . Retry , TimeSpan . FromMinutes ( 10 ) )
. Then < LogEnd > ( ) ; Dado que los flujos de trabajo suelen ser procesos de ejecución larga, deberán persistir en el almacenamiento entre los pasos. Hay varios proveedores de persistencia disponibles como paquetes NUGET separados.
Se puede conectar un proveedor de índice de búsqueda al núcleo de flujo de trabajo, lo que le permite indexar sus flujos de trabajo y buscar los datos y el estado de ellos. Estos también están disponibles como paquetes NUGET separados.
Hola Mundo
Múltiples resultados
Pase de datos
Paralelo
Sincronización
Mientras que el bucle
Declaración if
Eventos
Trabajadores de actividades
Tareas paralelas
Transacciones de saga (con compensación)
Tareas de fondo programadas
Tareas de fondo recurrentes
Inyección de dependencia
Ejecución diferida y pasos reentrantes
Bucle
Exponer una API REST
Flujo de trabajo humano (usuario)
Pruebas
Este proyecto tiene licencia bajo la licencia MIT: consulte el archivo de licencia.md para más detalles