日期:2014-05-17  浏览次数:21119 次

关于轻量级的状态机设计和实现
问题场景描述:
    有一个表单,有新增、修改、空白等几个“单据状态”,执行Toolbar上的对应按钮(比如[修改]按钮)以后,单据进入对应的单据状态,状态变为某个状态时,要执行关联的事件(或者叫动作)。
   表单的状态个数不固定、二次开发可扩展该状态。

目标:(C#实现)
    希望抽象出一套独立的“状态机”类库,该状态机不同于工作流中的那种状态机,支持根据配置文件状态管理和状态切换时的通用事件调用机制等...

问题:
    不知道目前.NET平台上是否有成熟的解决方案或者开源的类库实现。或者有过相关经营者请提供一些设计思路,大家一起头脑风暴一下~~~


   这是个讨论帖,先放50分 :)

------解决方案--------------------
1.楼主的思路就是很好的面向对象设计思路,
2.楼主描述的并不是"单据业务"的状态机,而是分解后的行为描述,
  你点击"新建"按钮,也就是触发"添加单据"这个行为的视图呈现
  比如,SaleOrder,界面的目标区域是pnl_1
Method MethdSave{get;set;}
btnAddNew_Click(object sender, EventArgs e){
    this.Createview(ModelDrv.MethodDrv.GetMethod("SaleOrderInsert"));
    }   
btnEdit_Click(object sender, EventArgs e){
    this.Createview(ModelDrv.MethodDrv.GetMethod("SaleOrderUpdate"));
    }
btnSave_Click(object sender, EventArgs e){
    //用当前视图更新Model
    ViewDrv.MethodDrv.UpdateModel(this,this.MethodSave);
    //调用数据访问层
    DAHelper.ExecuteMethod(this.MethodSave);
    }
void CreateView(Method pMethod){
    this.MethodSave= pMethod
   //向目标区域渲染该方法的视图,呈现给用户
    pnl_1.Controls.Clear();
    pnl_1.Controls.Add(ViewDrv.MethodDrv.CreateView(this.MethodSave)); 
    }

这个小例子省略了UpdateView的代码