问题场景描述:
    有一个表单,有新增、修改、空白等几个“单据状态”,执行Toolbar上的对应按钮(比如[修改]按钮)以后,单据进入对应的单据状态,状态变为某个状态时,要执行关联的事件(或者叫动作)。
   表单的状态个数不固定、二次开发可扩展该状态。目标:(C#实现)
    希望抽象出一套独立的“状态机”类库,该状态机不同于工作流中的那种状态机,支持根据配置文件状态管理和状态切换时的通用事件调用机制等...问题:
    不知道目前.NET平台上是否有成熟的解决方案或者开源的类库实现。或者有过相关经营者请提供一些设计思路,大家一起头脑风暴一下~~~
   这是个讨论帖,先放50分 :)

解决方案 »

  1.   


    http://www.codeproject.com/KB/tips/AbstractFSM.aspx看看这个,我想要做的跟这个类似,但是应该比这个要复杂些
      

  2.   

    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的代码
      

  3.   

    如上面这个图,这是描述Toolbar按钮在不同状态下是否可用的一个矩阵。这个矩阵是预先定义好的,可以作为元数据传递给“状态机”统一处理。如上图里的按钮个数和状态的个数都是可变的,通过设计器调整这个矩阵即可,不用再修改“状态机”的实现。简单的说,这事我要实现的“状态机”的一部分功能,大家可以从这个角度去考虑这个“状态机”的设计。
      

  4.   

    to MoneySoft:谢谢~
    你的答复有点儿接近,但不完全是我想要的。
      

  5.   

    我给你的代码已经说的很清楚了,
    单据内容和项目的处理称为:单据登记业务,
    AddNew,Edit,是不同的处理,他们有自己独立的"输入视图"(我们叫做ParamView),
    点击相应的按钮,就重绘目标区域的界面,
    点击保存或者放弃,就用单据查询方法的输出视图(我们叫做DataKeyView)再次重绘界面,
    而对于没有返回任何行的数据集,自然是用空白或者默认值填充的
    单据审核属于单据业务流程业务,单据从一种状态迁越到另一种状态
    你结合10楼的那张图,看一下,那里面定义了哪种状态是可以修改单据,哪种状态可以打印,你甚至还可以约定:允许导出,允许浏览
    但是定义本身并不会涉及任何界面的东西
      

  6.   

    progra 对状态机有很深刻的认识啊。希望今后能向你请教。