MSDN Magazine - December 2008 - (Page 61) you want to be. The strengths of WF—modularity, Additional Advice visibility, and feature set—will be more beneficial I’ll round out my advice with some important to you in some areas (complex and continuously points that didn’t otherwise merit a full section changing business logic) than in others (user inof their own: terface layout or data access layers). First, minimize use of CodeActivity. It can be Now consider the operations defined by each useful for one-off “glue” code to ensure proper domain element. In traditional object-oriented data flow between activities, but otherwise should programming, these will map to public methods be replaced by a custom activity specific to the of concrete types. In WF, such actions (say, “withtask at hand. draw money from bank account” or “add item to When integrating workflows with other subshopping cart”) usually map to individual custom systems, it is better to expose WF functionality activities that operate on one or more defined obindirectly through an interface. This promotes jects. The more you move toward WF on the conloose coupling and makes your workflow code tinuum, the more actions you’ll implement as WF easier to consume and easier to test. It also then activities, and the fewer you’ll implement as tradibecomes easier to vary the implementation of tional class methods. Figure 7 A Custom Composite WF logic over time. Use cases will define an ordered set of actions Activity with No Code-Based Don’t neglect to implement validators for your performed by an actor to achieve a specific goal, Logic custom activities. The WF activity composition as well as contingencies for error conditions. In model supports optional validation logic for alC# or Visual Basic, this might manifest itself through use of the lowed versus disallowed configuration of activities. You implement Strategy or Template Method patterns, resulting in methods this by subclassing ActivityValidator and attributing the target achanging off of actor type definitions. With WF, I like to map tivity type. See the accompanying code download for an example use cases to custom composite activities consisting of domain validator implementation. element action activities and other activities that define condiKnow that the boilerplate Visual Studio wizard-generated worktional logic in the use case. Figure 7 shows a custom compos- flow hosting code is useful for ad hoc invocation and testing of ite activity (AddCustomerWithAuditActivity) that contains no workflows, but little else. The most interesting and useful workcode-based logic; all steps are implemented as a series of custom flows might never execute from a command line! activity invocations. For maximum runtime agility, you should consider use of a deSince your use cases are now defined as custom composite activi- pendency injection container. Check out StructureMap (structureties, you can then define larger business processes (“do month-end map.sourceforge.net) or Spring.NET (springframework.net) for WF custom reconciliation” or “project next fiscal-year budget”) as workflows service configuration. that aggregate these custom composites. Actor behaviors can be If your workflow executes business rules using PolicyActivity, defined as class methods that accept all necessary input and launch consider extending the available grammar with domain-specific the appropriate workflow, passing data into the workflow as need- keywords by subclassing RuleAction. This increases expressiveness ed and harvesting results. Data can be passed via data binding or and comprehension of authored rules. service invocation, as appropriate. And last, but not least, remember to design your workflow hostDomain modeling and code design in WF have some simi- ing environment so that it is continuously available to service relarities, but also several key differences to the equivalent tasks in sponses from external systems, bound for idle workflows. Your imperative .NET programming. Anticipate a learning curve and workflow may be idle, but if your workflow host is not running, some refactoring opportunities as inevitable by-products of your the external system response may never be handled, and your idle first WF projects. workflow never awoken! For a broad technology like WF, any list of best practices or key principles is liable to be incomplete, or applicable to varying deadditional WF Resources grees depending on circumstance. The guidance found here comes from my own experiences, as well as those of my colleagues and Workflow Tips and Tricks students; it is broadly, but not universally, applicable. Consider your msdn.microsoft.com/magazine/cc721606 specific problem domain and constraints when deciding how my Workflow Services (Windows Workflow Foundation and Windows advice might best fit (or not fit) your needs. Communication Foundation) msdn.microsoft.com/magazine/cc164251 Build Workflows To Capture Data And Create Documents msdn.microsoft.com/magazine/cc534981 Loading Workflow Models in WF msdn.microsoft.com/magazine/cc507645 msdnmagazine.com Josh Lane is Principal Architect for business rule engine vendor InRule Technology Inc. and a .NET instructor for DevelopMentor. He lives in Atlanta, Ga. December 2008 61 http://structuremap.sourceforge.net http://www.Spring.NET http://structuremap.sourceforge.net http://www.springframework.net http://msdn.microsoft.com/magazine/cc721606 http://msdn.microsoft.com/magazine/cc164251 http://msdn.microsoft.com/magazine/cc534981 http://msdn.microsoft.com/magazine/cc507645 http://www.msdnmagazine.com
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.