MSDN Magazine - December 2008 - (Page 60) custom composite activities where the emphasis is on customized control flow instead of realizing a specific domain function. WF ships with several standard control flow composites such as IfElseActivity and WhileActivity. But with WF, you can realize more exotic cases, such as execution of composite child activities based on some configurable priority level, or perhaps use of a dependency network to determine execution order (see Figure 6). In addition, almost all of the various runtime services that ship with WF are extendible or replaceable. You’re free to (for example) Figure 6 Using a Dependency Network [Designer( typeof( DependencyNetworkActivityDesigner ) )] [ActivityValidator( typeof( DependencyNetworkActivityValidator ) )] public partial class DependencyNetworkActivity : SequenceActivity { DependencyProperty.RegisterAttached( "RunAfter", typeof( string ), typeof( DependencyNetworkActivity ), new PropertyMetadata( DependencyPropertyOptions.Metadata ) ); public static object GetRunAfter( object depObj ) { return ( (DependencyObject) depObj ).GetValue( RunAfterProperty ); } public static void SetRunAfter( object depObj, object value ) { ( (DependencyObject) depObj ).SetValue( RunAfterProperty, value ); } public DependencyNetworkActivity() { InitializeComponent(); } private IList _orderedList = null; private int _currentIndex = 0; protected override ActivityExecutionStatus Execute( ActivityExecutionContext aec ) { if ( this.EnabledActivities.Count == 0 ) { return ActivityExecutionStatus.Closed; } else { _orderedList = DependencyNetworkActivityValidator.ComputeOrderedList( this ); Debug.Assert( _orderedList != null ); Debug.Assert( _orderedList.Count == this.EnabledActivities.Count ); ScheduleNextChild( aec ); } return ActivityExecutionStatus.Executing; implement your own workflow persistence layer on top of another storage medium, or perhaps implement a workflow scheduler that executes against a custom thread pool implementation instead of the built-in .NET ThreadPool. Any such custom service is configured in exactly the same way as all other WF services, so the model is consistent and straightforward. Ultimately, the goal for WF is to remain flexible in the face of evolving technologies and application architectures, instead of mandating a rigid set of requirements that might otherwise render the technology less broadly applicable. Domain Modeling and Program Design } private void ScheduleNextChild( ActivityExecutionContext aec ) { Debug.Assert( aec != null ); Debug.Assert( _orderedList != null ); Debug.Assert( _currentIndex < _orderedList.Count ); Activity child = _orderedList[ _currentIndex++ ]; Debug.Assert( child != null ); child.Closed += ChildDone; } aec.ExecuteActivity( child ); private void ChildDone( object sender, ActivityExecutionStatusChangedEventArgs e ) { ActivityExecutionContext aec = ( sender as ActivityExecutionContext ); e.Activity.Closed -= ChildDone; if ( _currentIndex < _orderedList.Count ) { ScheduleNextChild( aec ); } else { aec.CloseActivity(); } } } One of the more difficult aspects of building software with WF is mapping elements of your problem domain to elements of a workflow. The primary issue is the control flow-centric programming model of WF in which—unlike traditional imperative, or objectoriented programming—the atomic elements of your workflow (activities) don’t represent entities in your problem domain, but rather actions or processing steps. It’s a subtle but important distinction, and it makes what are already non-trivial tasks (domain modeling and program design) even more challenging, especially for WF newcomers. It’s one thing to understand the mechanics of the WF programming model—activities, services, episodic execution, and the rest— but it’s another thing entirely to take a functional specification or a bunch of use cases and turn that into one or more efficient, wellfactored, robust workflows. What domain concepts map to an activity versus service versus an entire workflow? What data should flow through the workflow, and how? Where can work be done in parallel, and where must the workflow be designed to go idle, waiting on user input? Truth be told, it’s impossible to sufficiently answer such questions in the space of a few paragraphs. But I offer you here a few general guidelines that have served me well. As with any discussion of modeling and design, take the advice that follows as a starting point and not a complete treatment of the topic, and don’t assume this is the only way to achieve WF design nirvana. It isn’t. First, start your modeling phase as you normally would with use cases, actors, and domain elements given up-front design consideration suitable for your project. Use any approach that works for you; there’s no need for WF-specific accommodations here. Next, model your actors (Customer, BankManager, and so on) and your domain elements (PurchaseOrders, InsurancePolicies, AcmeWidgets) as objects. As always, give careful consideration to the data encapsulated by each item. Expose data with properties, as necessary. Stub out actor methods, but don’t implement them just yet. At this point, you have a decision to make. Is your intended design WF-centric, such that all significant behavior will be represented as distinct activities in one or more workflows? Or do you want to use WF in a more targeted fashion, implementing key aspects in WF while keeping the rest as more traditional .NET code? Don’t consider it a binary yes-or-no question; instead, give deliberate consideration to where on the spectrum between all WF and no WF Real-World WF 60 msdn magazine
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.