风型 WindStyle


《WF编程》系列之17 – 工作流与外部事件:工作流参数

3.2.2 工作流参数

Runtime的CreateWorkflow方法有一个重载允许我们向新的工作流实例传递参数,参数的类型是Dictionary(名值对的集合).

Dictionary parameters = new new Dictionary();
parameters.Add("FirstName", "Scott");
parameters.Add("LastName", "Allen");
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(chapter3_parameter.Workflow1), parameters);
instance.Start();

当工作流Runtime创建了新的工作流实例时,它会尝试寻找每个参数名称的伴随属性(Companion Property).伴随属性是工作流对象中公开并可写的属性,它们有着和工作流参数项相同的名字.举例来说,工作流会接受上面代码中的FirstName和LastName参数是因为在其内部有着同样名字的属性:

//只写
public string FirstName
{
set { _firstName = value; }
}
private string _firstName;

//只写
public string LastName
{
set { _lastName = value; }
}
private string _lastName;

//只读
public string FullName
{
get { return _fullName; }
}
private string _fullName;

如果我们尝试传递一个FullName参数,Runtime会抛出异常,因为FullName属性是只读的.Runtime无法为其找到相应的公开并可写的伴随属性,Runtime会抛出System.ArgumentException异常.对于参数来说,必须有公开并可写的属性与之对应;而对属性来说,并不是每一个公开并可写的属性都必须对应一个参数,输入参数是可选的.

工作流内的活动不需要关心如何取得参数值.Runtime会在工作流执行前将所有的参数指派给相应的属性.在上面的代码中, CodeActivity的ExecuteCode事件将接收到的FirstName和LastName参数合并到FullName属性中.不仅仅可以向工作流输入数据,我们还可以将FullName属性作为工作流的输出参数.当工作流完成时,Runtime触发WorkflowCompleted事件, 该事件的WorkflowCompletedEventArgs参数包含一个OutputParameters属性(输出参数的Dictionary集合),Runtime将复制每个公开可读的工作流属性到OutputParameters集合中.

现在来测试一下,输出的结果如下图所示:

可以看到我们输入的两个参数(Scott和Allen)合并的结果,但是DynamicUpdateCondition是什么呢?它并不是我们的输入参 数,之前提到过Runtime会把每个公开可读的工作流属性复制到OutputParameters集合中,而 DynamicUpdateCondition正是SequentialWorkflowActivity的一个公开并可读的属性.但问题又出来了, SequentialWorkflowActivity有很多公开并可读的属性,为什么仅仅是DynamicUpdateCondition被作为输出参 数?期待园子里的朋友可以回答我这个问题.

Related posts

15 Comments

  1. stswordman 说到:

    毕业了?恭喜恭喜:)

    回复回复
  2. 笑煞天 说到:

    @stswordman
    你最近怎么样啊?上次的MOSS项目有没有搞定?

    回复回复
  3. Samuel.M.Xu 说到:

    刚毕业,对WF理解这么深,挺强嘛!
    请问楼主:
    Dictionary parameters = new Dictionary();
    这句对吗???

    回复回复
  4. Samuel.M.Xu 说到:

    应该是这样吧:
    Dictionary<string, object> parameters = new Dictionary<string, object>();

    回复回复
  5. zjysky 说到:

    不正确啊。不能正常运行。泛型也是错误的

    回复回复
  6. 笑煞天 说到:

    @zjysky
    @Samuel.M.Xu
    谢谢两位朋友指正.

    回复回复
  7. 无痕羽 说到:

    兴许是研究生毕业

    回复回复
  8. 无名�� 说到:

    兴许是博士生毕业

    回复回复
  9. Windie Chai 说到:

    @无名尸烈士毕业,回答完毕。

    回复回复
  10. loogn 说到:

    高中毕业吧!–引用————————————————–
    无痕羽: 兴许是研究生毕业
    ——————————————————–
    –引用————————————————–
    无名尸: 兴许是博士生毕业
    ——————————————————–
    –引用————————————————–
    Windie Chai: @无名尸
    烈士毕���,回答完毕。
    ——————————————————–

    回复回复
  11. loogn 说到:

    顺序和状态机工作流都有一个DynamicUpdateCondition属性,如果你没有设置该属性工作流一直允许动态更新,当你设置了该属性后,当你在调用ApplyWorkflowChanges方法时就会去计算,如果为true则允许进行动态更新,否则就会抛出异常。

    回复回复
  12. Windie Chai 说到:

    @loognThanks。

    回复回复
  13. Maxi247 说到:

    DynamicUpdateCondition 没有[Browsable(false)]

    回复回复
  14. [...] 《WF编程》系列之17 – 工作流与外部事件:工作流参数 [...]

Leave a Reply