WF Activity Context
I was playing around with a state machine workflow in WF and ran across something that I didn’t except. Apparently if you have a an activity that can be other than a singleton, e.g. inside of a loop or as part of a state machine workflow, then an activity can not be accessed by it’s workflow instance variable. For example, the following works just fine in a sequence workflow:
public partial class Workflow2 : SequentialWorkflow { private void code1_ExecuteCode(object sender, EventArgs e) { // Retrieve Comment property from typed event sink (generated by wca) string comment = this.eventSink1.Comment; Console.WriteLine("Order approved w/ comment= {0}", comment); } }
However, in the case where the activity can be executed more than once, it’s my understand that each time through, there’s a new activity object that’s different from the named activity associated with the workflow. To get a hold of the current activity, you have to traverse the activity tree, which you can access in a code activity via the sender’s parent property:
public partial class StateMachine1 : StateMachineWorkflow { void code2_ExecuteCode(object sender, EventArgs e) { // Retrieve Comment property from typed event sink (generated by wca) Code codeActivity = (Code)sender; IOrderService_Events.OrderApproved eventSink2 = (IOrderService_Events.OrderApproved)(codeActivity.Parent.Activities["eventSink1"]); string comment = eventSink2.Comment; // eventSink1.Comment will be unbound Console.WriteLine("order approved w/ comment= {0}", comment); } }
I haven’t figured out whether this makes sense to me yet, but that’s how it is. You can get the code here.