我试图想出一个简单的工作流引擎()。
基本上我有一个具有 Status 属性的类的对象。为了使其进入不同的状态,它应该经过验证步骤。如果没有验证错误,状态将会更改。
在验证过程中,我想允许验证器组件向用户请求信息或发出警告消息。
我的问题是,到目前为止,应用程序是作为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 ,并附加事件来显示Form对象以请求信息。
另一种选择是在基类上附加处理程序,并在UI级别覆盖具体类。
我是朝着正确的方向前进的吗?如何允许验证器从用户(在UI级别)请求信息,在业务层保留一些逻辑,以使其适合Windows窗体和Web?
我很感激有关此事的任何意见。提前谢谢。
Ps。:在我写完之后,我意识到我不确定如何在Web应用程序上使用它。我的意思是,Windows窗体应用程序可以中断执行并为用户显示输入表单但不能在Web上工作。这是否意味着我的工作流程结构仅适用于桌面应用程序?
答案 0 :(得分:4)
首先,如果您想在工作流程中使用各种验证器,验证器将取决于环境=&gt;所以你可能需要策略模式。但你需要小心。
创建具有所有类型事件的界面可能不是一个完美的想法,因为要做的事情有些过分。请求验证器应该具有一些公共状态,并且该状态可能取决于验证结果,然后工作流应该只检查验证器状态。而不是使用事件我只是认为使用委托作为函数参数会更好。