MSDN Magazine - December 2008 - (Page 54) Figure 2 The Execute Method protected override ActivityExecutionStatus Execute( ActivityExecutionContext aec ) { if ( string.IsNullOrEmpty( SSN ) ) { throw new InvalidOperationException( "SSN property value is invalid." ); } ICreditScoring creditSvc = aec.GetService (); Debug.Assert( creditSvc != null ); WorkflowQueuingService queueSvc = aec.GetService (); Debug.Assert( queueSvc != null ); Guid queueName = Guid.NewGuid(); WorkflowQueue queue = queueSvc.CreateWorkflowQueue( queueName, false ); queue.QueueItemAvailable += CreditScoreComputed; creditSvc.ComputeScoreAsync( SSN, queueName ); } return ActivityExecutionStatus.Executing; contained within the activity definition, is registered as a service with the WF runtime: // create an instance of your service type LoggingService logSvc = new LoggingService(); // register it with the WorkflowRuntime instance workflowRuntime.AddService( logSvc ); WorkflowInstance instance = workflowRuntime.CreateWorkflow( typeof( Workflow1 ) ); instance.Start(); During execution, an activity can request access to the services it needs through the ActivityExecutionContext (activities never interact directly with their host runtime) and use the configured services to perform work, while letting the WF runtime and host manage service lifetimes: protected override ActivityExecutionStatus Execute( ActivityExecutionContext aec ) { // ActivityExecutionContext provides access to services LoggingService logSvc = aec.GetService (); Debug.Assert( logSvc != null ); logSvc.LogEvent( EvtType, Message ); return ActivityExecutionStatus.Closed; itly defined via method parameters or return values. Data flows from one activity to another using built-in support for activity data binding. You also have the option of manipulating shared state by interacting with configured services in the logic of your custom WF activities. The basic execution sequence for WF activities is to initialize activity state, execute activity, examine resultant activity state for changes, then repeat for all other activities. So it is precisely the side effects of activity execution (“What is the new value of the PurchaseOrderTotal property?” or “What database value just } The power of the WF service model stems from its simplicity. Any .NET object can be configured as a service. changed?”) that tell you what just happened and what will happen next. You do have the potential for activities to manipulate state in ways undesirable for other downstream activities (however, note that the risk here is no worse than that inherent in any imperative language like C#), but you don’t pay the performance costs associated with data copying. Services, Services, Services As a general purpose programming environment, WF is designed to integrate with external subsystems and code. The most direct way to accomplish this is to author custom workflow activities that make database or Web service calls or call into third-party libraries. In WF terminology, such external systems are known as services. The idea behind WF services is simple: any library or functional element that is required by an activity in your workflow, but is not 54 msdn magazine Typical service examples include logging components, data access layers, and proxies to external subsystems, though the possibilities are limitless. The power of the WF service model stems from its simplicity. Literally any .NET object can be configured as a service. Note that some extra behaviors, such as service lifetime management, are available to services explicitly designed to subclass WorkflowRuntimeService. Also, I usually find it useful to expose services via an interface instead of through a concrete type; this makes it easier to vary the service implementation independent of the activities that depend on it. So the key best practice here is the decoupling of a custom WF activity’s core logic from the constituent pieces needed to accomplish its work. Additionally, you should refactor into a service logic that is stateful and is shared among multiple activities in a workflow (logging, for example); it would be cumbersome to pass a reference to the logging component down the activity graph during execution. This is further complicated for workflows serialized at some point during their execution cycle. I’ll mention one other bit of advice regarding services. Windows WF ships with an infrastructure known as local services for calling out to .NET class instances from activities, as well as handling .NET events inside an activity. You interact with these local services via the CallExternalMethod and HandleExternalEvent activities. They are essentially an extra layer on top of the base WF service infrastructure and provide the same benefits as raw services in a declarative style friendlier to WF host environments such as SharePoint. However, for more general-purpose hosts such as Windows Presentation Foundation (WPF) or ASP.NET, this extra layer can be more cumbersome to use than the equivalent raw service configuration. Keep in mind your anticipated hosting requirements before building solutions with local services. A key principle to employ here is to leverage the power and flexReal-World WF
Table of Contents Feed for the Digital Edition of MSDN Magazine - December 2008 MSDN Magazine - December 2008 Contents Toolbox CLR Inside Out Advanced Basics Cutting Edge Patterns In Practice Team System Real-World WF Visual Studio OBA Tools SOA Data Access Geneva Framework Test Run Foundations Windows With C++ Going Places End Bracket MSDN Magazine - December 2008 MSDN Magazine - December 2008 - (Page Intro) MSDN Magazine - December 2008 - Contents (Page Cover1) MSDN Magazine - December 2008 - Contents (Page Cover2) MSDN Magazine - December 2008 - Contents (Page 1) MSDN Magazine - December 2008 - Contents (Page 2) MSDN Magazine - December 2008 - Contents (Page 3) MSDN Magazine - December 2008 - Contents (Page 4) MSDN Magazine - December 2008 - Contents (Page 5) MSDN Magazine - December 2008 - Contents (Page 6) MSDN Magazine - December 2008 - Contents (Page 7) MSDN Magazine - December 2008 - Contents (Page 8) MSDN Magazine - December 2008 - Contents (Page 9) MSDN Magazine - December 2008 - Contents (Page 10) MSDN Magazine - December 2008 - Toolbox (Page 11) MSDN Magazine - December 2008 - Toolbox (Page 12) MSDN Magazine - December 2008 - Toolbox (Page 13) MSDN Magazine - December 2008 - Toolbox (Page 14) MSDN Magazine - December 2008 - CLR Inside Out (Page 15) MSDN Magazine - December 2008 - CLR Inside Out (Page 16) MSDN Magazine - December 2008 - CLR Inside Out (Page 17) MSDN Magazine - December 2008 - CLR Inside Out (Page 18) MSDN Magazine - December 2008 - CLR Inside Out (Page 19) MSDN Magazine - December 2008 - CLR Inside Out (Page 20) MSDN Magazine - December 2008 - CLR Inside Out (Page 21) MSDN Magazine - December 2008 - Advanced Basics (Page 22) MSDN Magazine - December 2008 - Advanced Basics (Page 23) MSDN Magazine - December 2008 - Advanced Basics (Page 24) MSDN Magazine - December 2008 - Advanced Basics (Page 25) MSDN Magazine - December 2008 - Advanced Basics (Page 26) MSDN Magazine - December 2008 - Advanced Basics (Page 27) MSDN Magazine - December 2008 - Advanced Basics (Page 28) MSDN Magazine - December 2008 - Cutting Edge (Page 29) MSDN Magazine - December 2008 - Cutting Edge (Page 30) MSDN Magazine - December 2008 - Cutting Edge (Page 31) MSDN Magazine - December 2008 - Cutting Edge (Page 32) MSDN Magazine - December 2008 - Cutting Edge (Page 33) MSDN Magazine - December 2008 - Cutting Edge (Page 34) MSDN Magazine - December 2008 - Cutting Edge (Page 35) MSDN Magazine - December 2008 - Cutting Edge (Page 36) MSDN Magazine - December 2008 - Patterns In Practice (Page 37) MSDN Magazine - December 2008 - Patterns In Practice (Page 38) MSDN Magazine - December 2008 - Patterns In Practice (Page 39) MSDN Magazine - December 2008 - Patterns In Practice (Page 40) MSDN Magazine - December 2008 - Patterns In Practice (Page 41) MSDN Magazine - December 2008 - Patterns In Practice (Page 42) MSDN Magazine - December 2008 - Patterns In Practice (Page 43) MSDN Magazine - December 2008 - Team System (Page 44) MSDN Magazine - December 2008 - Team System (Page 45) MSDN Magazine - December 2008 - Team System (Page 46) MSDN Magazine - December 2008 - Team System (Page 47) MSDN Magazine - December 2008 - Team System (Page 48) MSDN Magazine - December 2008 - Team System (Page 49) MSDN Magazine - December 2008 - Team System (Page 50) MSDN Magazine - December 2008 - Team System (Page 51) MSDN Magazine - December 2008 - Real-World WF (Page 52) MSDN Magazine - December 2008 - Real-World WF (Page 53) MSDN Magazine - December 2008 - Real-World WF (Page 54) MSDN Magazine - December 2008 - Real-World WF (Page 55) MSDN Magazine - December 2008 - Real-World WF (Page 56) MSDN Magazine - December 2008 - Real-World WF (Page 57) MSDN Magazine - December 2008 - Real-World WF (Page 58) MSDN Magazine - December 2008 - Real-World WF (Page 59) MSDN Magazine - December 2008 - Real-World WF (Page 60) MSDN Magazine - December 2008 - Real-World WF (Page 61) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 62) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 63) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 64) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 65) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 66) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 67) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 68) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 69) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 70) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 71) MSDN Magazine - December 2008 - SOA Data Access (Page 72) MSDN Magazine - December 2008 - SOA Data Access (Page 73) MSDN Magazine - December 2008 - SOA Data Access (Page 74) MSDN Magazine - December 2008 - SOA Data Access (Page 75) MSDN Magazine - December 2008 - SOA Data Access (Page 76) MSDN Magazine - December 2008 - SOA Data Access (Page 77) MSDN Magazine - December 2008 - SOA Data Access (Page 78) MSDN Magazine - December 2008 - SOA Data Access (Page 79) MSDN Magazine - December 2008 - SOA Data Access (Page 80) MSDN Magazine - December 2008 - SOA Data Access (Page 81) MSDN Magazine - December 2008 - Geneva Framework (Page 82) MSDN Magazine - December 2008 - Geneva Framework (Page 83) MSDN Magazine - December 2008 - Geneva Framework (Page 84) MSDN Magazine - December 2008 - Geneva Framework (Page 85) MSDN Magazine - December 2008 - Geneva Framework (Page 86) MSDN Magazine - December 2008 - Geneva Framework (Page 87) MSDN Magazine - December 2008 - Geneva Framework (Page 88) MSDN Magazine - December 2008 - Geneva Framework (Page 89) MSDN Magazine - December 2008 - Geneva Framework (Page 90) MSDN Magazine - December 2008 - Test Run (Page 91) MSDN Magazine - December 2008 - Test Run (Page 92) MSDN Magazine - December 2008 - Test Run (Page 93) MSDN Magazine - December 2008 - Test Run (Page 94) MSDN Magazine - December 2008 - Test Run (Page 95) MSDN Magazine - December 2008 - Test Run (Page 96) MSDN Magazine - December 2008 - Test Run (Page 97) MSDN Magazine - December 2008 - Test Run (Page 98) MSDN Magazine - December 2008 - Test Run (Page 99) MSDN Magazine - December 2008 - Test Run (Page 100) MSDN Magazine - December 2008 - Foundations (Page 101) MSDN Magazine - December 2008 - Foundations (Page 102) MSDN Magazine - December 2008 - Foundations (Page 103) MSDN Magazine - December 2008 - Foundations (Page 104) MSDN Magazine - December 2008 - Foundations (Page 105) MSDN Magazine - December 2008 - Foundations (Page 106) MSDN Magazine - December 2008 - Foundations (Page 107) MSDN Magazine - December 2008 - Foundations (Page 108) MSDN Magazine - December 2008 - Windows With C++ (Page 109) MSDN Magazine - December 2008 - Windows With C++ (Page 110) MSDN Magazine - December 2008 - Windows With C++ (Page 111) MSDN Magazine - December 2008 - Windows With C++ (Page 112) MSDN Magazine - December 2008 - Going Places (Page 113) MSDN Magazine - December 2008 - Going Places (Page 114) MSDN Magazine - December 2008 - Going Places (Page 115) MSDN Magazine - December 2008 - Going Places (Page 116) MSDN Magazine - December 2008 - Going Places (Page 117) MSDN Magazine - December 2008 - Going Places (Page 118) MSDN Magazine - December 2008 - Going Places (Page 119) MSDN Magazine - December 2008 - End Bracket (Page 120) MSDN Magazine - December 2008 - End Bracket (Page Cover3) MSDN Magazine - December 2008 - End Bracket (Page Cover4)
For optimal viewing of this digital publication, please enable JavaScript and then refresh the page. If you would like to try to load the digital publication without using Flash Player detection, please click here.