我如何建模和构建这个工作流引擎

本文关键字:构建 工作流 引擎 何建模 建模 | 更新日期: 2023-09-27 17:54:05

我正在努力想出(我希望是)一个有点简单的工作流引擎。

基本上我有一个类的对象与状态属性。为了将其推进到不同的状态,它应该经过一个验证步骤。如果没有验证错误,状态将被更改。

但是,在验证期间,我希望允许验证器组件向用户请求信息或发出警报消息。

我的问题是,到目前为止,该应用程序是作为Windows窗体应用程序构建的,但我们知道,它将有必要有一个web版本。因此,两者的验证将是相同的,但应该允许每个都有自己的方式来请求信息或提醒用户。我设想的方法是在我的验证类上使用委托和事件。

这是我得到的:

//This is the class which will have its status changed
public class MyClass
{
  public int Status { get; set; }
}
//This class represent a transition from one status to another
public class Transition
{
  public int FromStatus { get; set; }
  public int ToStatus { get; set; }
}
//Common interface for all validators
public interface IWorkflowValidator
{
  bool Validate(MyClass object);
}
//This is the base workflow class with the main logic
public abstract class BaseWorkflow
{
  //This holds all the possible transitions with the validator type responsible for its validation.
  //For example:
  //  var transition = new Transition(1, 2); //From 1 to 2
  //  validatorsMap.Add(transition, typeof(ValidatorFrom1To2)); //ValidatorFrom1To2 class would be used to validate transition from status 1 to 2.
  protected Dictionary<Transition, Type> validatorsMap = null;
  //Main logic for a transition
  public void PerformTransition(MyClass object, int ToStatus)
  {
    int currentStatus = object.Status;
    var requestedTransition = new Transition(currentStatus, ToStatus);
    //Get the validator specified for this transition
    var validatorType = validatorsMap[requestedTransition];
    //Instantiate a new validator of that type
    var validator = (IWorkflowValidator)Activator.CreateInstance(validatorType);
    //Gets the result of the validator
    bool results = validator.Validate(object);
    //If validation succeded, it will perform the transition and complete the execution
  }
}

我的主要问题与验证器本身有关。如前所述,我需要验证器能够请求特定转换所需的信息。这就是我创建第一个验证器的方法:

public class AlertHandlerArguments {}
public delegate void AlertHandler(AlertHandlerArguments args);
public class MyFirstValidator : IWorkflowValidator
{
  //Event used to send an alert to the user
  public event AlertHandler OnAlert;
  //Implementation of IWorkflowValidator
  public bool Validate(MyClass object)
  {
    SendAlert();
  }
  void SendAlert()
  {
    if (OnAlert != null)
      OnAlert(new AlertHandlerArguments());
  }
}

我在这里想的是创建一个具有所有类型事件的接口,并在所有验证器上实现这些接口。然后我的抽象BaseWorkflow类可以为这些事件附加处理程序。

但是,我的抽象类不能实现这些事件的最终代码。这些都是由接口使用的,到目前为止,我的抽象类是独立于平台的(桌面,web)。这就是为什么我创建这个抽象类的原因。

我可以有我的Windows窗体项目有一个具体类型的BaseWorkflow和附加事件来显示窗体对象请求信息。

另一种选择是在基类上附加处理程序,并在UI级别重写具体类。

我走的方向对吗?我如何允许验证器从用户请求信息(在UI级别)保持一些逻辑在业务层,使其适合windows窗体和web?

我感谢你对这件事的任何意见。提前谢谢。

p。只有在我写完之后,我才意识到我不是很确定如何在web应用程序中使用它。我的意思是,Windows窗体应用程序可以中断执行并为用户显示输入表单,但这在web上不起作用。这是否意味着我的工作流结构只适用于桌面应用程序?

我如何建模和构建这个工作流引擎

首先,如果您想在您的工作流中使用各种验证器,并且验证器将依赖于环境=>所以您可能需要策略模式。但你得小心点。

创建具有所有类型事件的接口可能不是一个完美的主意,因为要做的事情太多了。最好验证器应该有一些公共状态,该状态可以依赖于验证结果,然后工作流应该检查验证器状态。而不是使用事件,我只是认为它会更好地使用委托作为函数参数