<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?><rss version="2.0"><channel><title>fluentworkflow Wiki Rss Feed</title><link>http://fluentworkflow.codeplex.com/</link><description>fluentworkflow Wiki Rss Description</description><item><title>Updated Wiki: Home</title><link>http://fluentworkflow.codeplex.com/wikipage?version=37</link><description>&lt;div class="wikidoc"&gt;&lt;b&gt;Project Description&lt;/b&gt;&lt;br /&gt;Fluent workflow is a lightweight DSL used to describe a workflow and it&amp;#39;s discrete action components to an IoC container for light, fast injectable state engine wire up in your application.  &lt;br /&gt;
&lt;h1&gt;Documentation&lt;/h1&gt;&lt;h2&gt;Table of Contents&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Introduction&amp;referringTitle=Home"&gt;Introduction&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=What%20is%20a%20Workflow%3f&amp;referringTitle=Home"&gt;What is a Workflow&amp;#63;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Design%20Goals&amp;referringTitle=Home"&gt;Design Goals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Building%20FluentWorkflow&amp;referringTitle=Home"&gt;Building FluentWorkflow&lt;/a&gt; (*new)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Roadmap%20to%20v1.0&amp;referringTitle=Home"&gt;Roadmap to v1.0&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Creating State Tasks
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=State%20Task%20Design%20Considerations&amp;referringTitle=Home"&gt;State Task Design Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20Exit%20State%20Tasks&amp;referringTitle=Home"&gt;Creating State Exit Tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20State%20Entry%20Tasks&amp;referringTitle=Home"&gt;Creating State Entry Tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20Mutatable%20Entry%20Tasks&amp;referringTitle=Home"&gt;Creating Mutatable Entry Tasks&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Using%20the%20FlowMutator&amp;referringTitle=Home"&gt;Using the FlowMutator&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Entry%20State%20Task%20Info&amp;referringTitle=Home"&gt;Transition Context for Entry Tasks&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Configuring the Workflow
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=An%20Overview%20of%20the%20Configuration%20Process&amp;referringTitle=Home"&gt;An Overview of the Configuration Process&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Setting%20up%20a%20FluentWorkflow%20Module&amp;referringTitle=Home"&gt;Setting up a FluentWorkflow Module and Configuring the Workflow&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=ForWorkflow%28TWorkflow%2c%20TState%29&amp;referringTitle=Home"&gt;ForWorkflow&amp;#40;TWorkflow, TState&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Permit%28TTrigger%2c%20TState%29&amp;referringTitle=Home"&gt;Permit&amp;#40;TTrigger, TState&amp;#41;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnEntry%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnEntry&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnMutatableEntry%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnMutatableEntry&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnExit%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnExit&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Registering%20the%20Fluent%20Workflow%20Module&amp;referringTitle=Home"&gt;Registering the Fluent Workflow Module&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;Understanding the Compilation Exceptions&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Using%20the%20FluentWorkflow%20StateEngine&amp;referringTitle=Home"&gt;Using the FluentWorkflow StateEngine&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Enumerating%20valid%20triggers&amp;referringTitle=Home"&gt;Enumerating valid triggers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Firing%20a%20trigger%20at%20the%20FluentWorkflow%20StateEngine&amp;referringTitle=Home"&gt;Firing a trigger at the FluentWorkflow StateEngine&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 01 Feb 2011 04:30:54 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110201043054A</guid></item><item><title>Updated Wiki: Home</title><link>http://fluentworkflow.codeplex.com/wikipage?version=36</link><description>&lt;div class="wikidoc"&gt;&lt;b&gt;Project Description&lt;/b&gt;&lt;br /&gt;Fluent workflow is a lightweight DSL used to describe a workflow and it&amp;#39;s discrete action components to an IoC container for light, fast injectable state engine wire up in your application.  &lt;br /&gt;
&lt;h1&gt;Documentation&lt;/h1&gt;&lt;h2&gt;Table of Contents&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Introduction&amp;referringTitle=Home"&gt;Introduction&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=What%20is%20a%20Workflow%3f&amp;referringTitle=Home"&gt;What is a Workflow&amp;#63;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Design%20Goals&amp;referringTitle=Home"&gt;Design Goals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Building%20FluentWorkflow&amp;referringTitle=Home"&gt;Building FluentWorkflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Roadmap%20to%20v1.0&amp;referringTitle=Home"&gt;Roadmap to v1.0&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Creating State Tasks
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=State%20Task%20Design%20Considerations&amp;referringTitle=Home"&gt;State Task Design Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20Exit%20State%20Tasks&amp;referringTitle=Home"&gt;Creating State Exit Tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20State%20Entry%20Tasks&amp;referringTitle=Home"&gt;Creating State Entry Tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20Mutatable%20Entry%20Tasks&amp;referringTitle=Home"&gt;Creating Mutatable Entry Tasks&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Using%20the%20FlowMutator&amp;referringTitle=Home"&gt;Using the FlowMutator&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Entry%20State%20Task%20Info&amp;referringTitle=Home"&gt;Transition Context for Entry Tasks&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Configuring the Workflow
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=An%20Overview%20of%20the%20Configuration%20Process&amp;referringTitle=Home"&gt;An Overview of the Configuration Process&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Setting%20up%20a%20FluentWorkflow%20Module&amp;referringTitle=Home"&gt;Setting up a FluentWorkflow Module and Configuring the Workflow&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=ForWorkflow%28TWorkflow%2c%20TState%29&amp;referringTitle=Home"&gt;ForWorkflow&amp;#40;TWorkflow, TState&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Permit%28TTrigger%2c%20TState%29&amp;referringTitle=Home"&gt;Permit&amp;#40;TTrigger, TState&amp;#41;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnEntry%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnEntry&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnMutatableEntry%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnMutatableEntry&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnExit%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnExit&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Registering%20the%20Fluent%20Workflow%20Module&amp;referringTitle=Home"&gt;Registering the Fluent Workflow Module&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;Understanding the Compilation Exceptions&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Using%20the%20FluentWorkflow%20StateEngine&amp;referringTitle=Home"&gt;Using the FluentWorkflow StateEngine&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Enumerating%20valid%20triggers&amp;referringTitle=Home"&gt;Enumerating valid triggers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Firing%20a%20trigger%20at%20the%20FluentWorkflow%20StateEngine&amp;referringTitle=Home"&gt;Firing a trigger at the FluentWorkflow StateEngine&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 01 Feb 2011 04:30:31 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110201043031A</guid></item><item><title>Updated Wiki: Building FluentWorkflow</title><link>http://fluentworkflow.codeplex.com/wikipage?title=Building FluentWorkflow&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;FluentWorkflow is sourcecode can be downloaded from CodePlex using Mercurial.&amp;#160; You can
&lt;a href="http://fluentworkflow.codeplex.com/SourceControl/list/changesets" target="_blank"&gt;
browse the source code online&lt;/a&gt; where there are &lt;a href="http://codeplex.codeplex.com/Wikipage?title=Source%20Control%20Clients" target="_blank"&gt;
instructions on how to install and use mercurial&lt;/a&gt; to pull the sourcecode locally to your machine.&lt;/p&gt;
&lt;p&gt;FluentWorkflow uses a build system called ‘Rake’.&amp;#160; This means you need to have Ruby installed on your machine along with Ruby Gems.&amp;#160; You can use the
&lt;a href="http://www.ruby-lang.org/en/downloads/" target="_blank"&gt;Ruby Installer at the Ruby language site&lt;/a&gt; to get up and running. Once you have installed Ruby, drop to the command line and type:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;gem install -- remote rake&lt;/pre&gt;
&lt;p&gt;This will install rake on your system and you are ready to build.&lt;/p&gt;
&lt;p&gt;After you clone the FluentWorkflow repository to your local machine, you can perform a build by simply typing ‘rake’ at the command line when you are in the FluentWorkflow directory or any of its children.&amp;#160; There are three variants of the command line:&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;font size="5" face="Courier New"&gt;&lt;strong&gt;rake&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Running this command will run the build and run all unit tests.&amp;#160; The build is successful if both complete successfully.&lt;/p&gt;
&lt;p&gt;&lt;font size="5" face="Courier New"&gt;&lt;strong&gt;rake deploy&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;This command stamps the revision number to 0 and builds all associated DLLs with that number.&amp;#160; This builds the project, runs the unit tests and kicks off a task to create the nuget package.&lt;/p&gt;
&lt;p&gt;&lt;font size="5" face="Courier New"&gt;&lt;strong&gt;rake deploy revision=[number]&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;This command stamps the revision number with the provided revision value and builds all associated DLLs with that number. This builds the project, runs the unit tests and kicks off a task to create the nuget package.&amp;#160; The nuget package is also properly
 configured with the same revision number. &lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 01 Feb 2011 04:29:16 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Building FluentWorkflow 20110201042916A</guid></item><item><title>Updated Wiki: Creating Exit State Tasks</title><link>http://fluentworkflow.codeplex.com/wikipage?title=Creating Exit State Tasks&amp;version=13</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;In order to create an Exit State Task, we create a public class that derives from the interface IExitStateTask&amp;lt;TState, TTrigger, TTriggerContext&amp;gt;.&amp;#160; Note that the workflow does not have to specified here.&lt;/p&gt;
&lt;p&gt;There is a lone interface that needs to be implemented called ‘Execute’:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IMutatingEntryStateTask&amp;lt;TState, TTrigger, TTriggerContext&amp;gt; : IStateTask&amp;lt;TState, TTrigger, TTriggerContext&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Executes the specified entry state step info.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;entryStateTaskInfo&amp;quot;&amp;gt;The entry state step info.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;flowMutator&amp;quot;&amp;gt;The flow mutator.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; Execute(EntryStateTaskInfo&amp;lt;TState, TTrigger, TTriggerContext&amp;gt; entryStateTaskInfo,&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                    IFlowMutator&amp;lt;TTrigger, TTriggerContext&amp;gt; flowMutator);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;DI/IOC Note&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Remember that you can constructor inject any services provided by the IoC container.
&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 04 Jan 2011 07:56:45 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Creating Exit State Tasks 20110104075645A</guid></item><item><title>Updated Wiki: Creating Exit State Tasks</title><link>http://fluentworkflow.codeplex.com/wikipage?title=Creating Exit State Tasks&amp;version=12</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;In order to create an Exit State Task, we create a public class that derives from the interface IExitStateTask&amp;lt;TState, TTrigger, TTriggerContext&amp;gt;.&amp;#160; Note that the workflow does not have to specified here.&lt;/p&gt;
&lt;p&gt;There is alone interface that needs to be implemented called:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IMutatingEntryStateTask&amp;lt;TState, TTrigger, TTriggerContext&amp;gt; : IStateTask&amp;lt;TState, TTrigger, TTriggerContext&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Executes the specified entry state step info.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;entryStateTaskInfo&amp;quot;&amp;gt;The entry state step info.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;flowMutator&amp;quot;&amp;gt;The flow mutator.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; Execute(EntryStateTaskInfo&amp;lt;TState, TTrigger, TTriggerContext&amp;gt; entryStateTaskInfo,&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                    IFlowMutator&amp;lt;TTrigger, TTriggerContext&amp;gt; flowMutator);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;DI/IOC Note&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Remember that you can constructor inject any services provided by the IoC container.
&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 04 Jan 2011 07:55:17 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Creating Exit State Tasks 20110104075517A</guid></item><item><title>Updated Wiki: Creating Exit State Tasks</title><link>http://fluentworkflow.codeplex.com/wikipage?title=Creating Exit State Tasks&amp;version=11</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;In order to create an Exit State Task, we create a public class that derives from the interface IExitStateTask&amp;lt;TState, TTrigger, TTriggerContext&amp;gt;.&amp;#160; Note that the workflow does not have to specified here.&lt;/p&gt;
&lt;p&gt;There is alone interface that needs to be implemented called:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IMutatingEntryStateTask&amp;lt;TState, TTrigger, TTriggerContext&amp;gt; : IStateTask&amp;lt;TState, TTrigger, TTriggerContext&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Executes the specified entry state step info.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;entryStateTaskInfo&amp;quot;&amp;gt;The entry state step info.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;flowMutator&amp;quot;&amp;gt;The flow mutator.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; Execute(EntryStateTaskInfo&amp;lt;TState, TTrigger, TTriggerContext&amp;gt; entryStateTaskInfo,&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                    IFlowMutator&amp;lt;TTrigger, TTriggerContext&amp;gt; flowMutator);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;DI/IOC Note&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Remember that you can constructor inject any services provided by the IoC container.&amp;#160; For example, if you need to inject an email service that you’ve implemented behind an ICommentMessaging interface for example, your constructor would like like this:&lt;/p&gt;
&lt;p&gt;Notice how the ICommentMessaging is foreign to FluentWorkflow – it’s a good example of an implementation you draw up in your system and register it with the container.&amp;#160; From a testing perspective, you will notice that this is very easy to test – almost
 trivial.&amp;#160; There is virtually no limit to the number of things you can do inside an ‘Execute’ method.&amp;#160;
&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 04 Jan 2011 07:53:14 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Creating Exit State Tasks 20110104075314A</guid></item><item><title>Updated Wiki: Creating Exit State Tasks</title><link>http://fluentworkflow.codeplex.com/wikipage?title=Creating Exit State Tasks&amp;version=10</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;In order to create an Exit State Task, we create a public class that derives from the interface IExitStateTask&amp;lt;TState, TTrigger, TTriggerContext&amp;gt;.&amp;#160; Note that the workflow does not have to specified here.&lt;/p&gt;
&lt;p&gt;There is alone interface that needs to be implemented called:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IMutatingEntryStateTask&amp;lt;TState, TTrigger, TTriggerContext&amp;gt; : IStateTask&amp;lt;TState, TTrigger, TTriggerContext&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Executes the specified entry state step info.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;entryStateTaskInfo&amp;quot;&amp;gt;The entry state step info.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;flowMutator&amp;quot;&amp;gt;The flow mutator.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; Execute(EntryStateTaskInfo&amp;lt;TState, TTrigger, TTriggerContext&amp;gt; entryStateTaskInfo,&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                    IFlowMutator&amp;lt;TTrigger, TTriggerContext&amp;gt; flowMutator);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;When implementing this method, the exitStateTaskInfo parameter provides us with runtime context.&amp;#160; This includes the runtime instance of TTriggerContext and state transition information.&amp;#160;
&lt;/p&gt;
&lt;p&gt;It is within the Execute method that we can perform the details of the task at hand.&amp;#160; There is no return value necessary, just be certain to handle exceptions appropriately and avoid throwing them back to FluentWorkflow.&amp;#160;
&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;DI/IOC Note&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Remember that you can constructor inject any services provided by the IoC container.&amp;#160; For example, if you need to inject an email service that you’ve implemented behind an ICommentMessaging interface for example, your constructor would like like this:&lt;/p&gt;
&lt;p&gt;Notice how the ICommentMessaging is foreign to FluentWorkflow – it’s a good example of an implementation you draw up in your system and register it with the container.&amp;#160; From a testing perspective, you will notice that this is very easy to test – almost
 trivial.&amp;#160; There is virtually no limit to the number of things you can do inside an ‘Execute’ method.&amp;#160;
&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 04 Jan 2011 07:51:45 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Creating Exit State Tasks 20110104075145A</guid></item><item><title>Updated Wiki: Creating Exit State Tasks</title><link>http://fluentworkflow.codeplex.com/wikipage?title=Creating Exit State Tasks&amp;version=9</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;In order to create an Exit State Task, we create a public class that derives from the interface IExitStateTask&amp;lt;TState, TTrigger, TTriggerContext&amp;gt;.&amp;#160; Note that the workflow does not have to specified here.&lt;/p&gt;
&lt;p&gt;There is alone interface that needs to be implemented called:&lt;/p&gt;
&lt;p&gt;When implementing this method, the exitStateTaskInfo parameter provides us with runtime context.&amp;#160; This includes the runtime instance of TTriggerContext and state transition information.&amp;#160;
&lt;/p&gt;
&lt;p&gt;It is within the Execute method that we can perform the details of the task at hand.&amp;#160; There is no return value necessary, just be certain to handle exceptions appropriately and avoid throwing them back to FluentWorkflow.&amp;#160;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;DI/IOC Note&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Remember that you can constructor inject any services provided by the IoC container.&amp;#160; For example, if you need to inject an email service that you’ve implemented behind an ICommentMessaging interface for example, your constructor would like like this:&lt;/p&gt;
&lt;p&gt;Notice how the ICommentMessaging is foreign to FluentWorkflow – it’s a good example of an implementation you draw up in your system and register it with the container.&amp;#160; From a testing perspective, you will notice that this is very easy to test – almost
 trivial.&amp;#160; There is virtually no limit to the number of things you can do inside an ‘Execute’ method.&amp;#160;
&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 04 Jan 2011 07:49:51 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Creating Exit State Tasks 20110104074951A</guid></item><item><title>Updated Wiki: Creating Mutatable Entry Tasks</title><link>http://fluentworkflow.codeplex.com/wikipage?title=Creating Mutatable Entry Tasks&amp;version=4</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: An entry task that has the ability to declare that a trigger should be set on the workflow allowing for an automatic redirection of state.&amp;#160; Subsequent Entry tasks will not be run on the current state when a trigger is set.&lt;/p&gt;
&lt;p&gt;A mutating entry state task is functionality identical to a regular entry task with the exception that a “flow mutator” is handed to the execute method.&amp;#160; The mutator allows the task to set a trigger that will initiate a new state change according to
 the rules of that trigger on the current state.&amp;#160; Those rules are defined by the workflow configuration.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IMutatingEntryStateTask&amp;lt;TState, TTrigger, TTriggerContext&amp;gt; : IStateTask&amp;lt;TState, TTrigger, TTriggerContext&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Executes the specified entry state step info.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;entryStateTaskInfo&amp;quot;&amp;gt;The entry state step info.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;flowMutator&amp;quot;&amp;gt;The flow mutator.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; Execute(EntryStateTaskInfo&amp;lt;TState, TTrigger, TTriggerContext&amp;gt; entryStateTaskInfo,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                IFlowMutator&amp;lt;TTrigger, TTriggerContext&amp;gt; flowMutator);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Changing the workflow is typically a task that involves interrogating the entryStateTaskInfo (and likely the Context property) to determine if the flowMutator should be set.&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; AutoApproveProcessor : IMutatingEntryStateTask&amp;lt;WorkflowState, StateTrigger, IDocumentContext&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Execute(EntryStateTaskInfo&amp;lt;WorkflowState, StateTrigger, IDocumentContext&amp;gt; entryStateTaskInfo, IFlowMutator&amp;lt;StateTrigger, IDocumentContext&amp;gt; flowMutator)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt;(entryStateTaskInfo.Context.UserName == &lt;span class="str"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            flowMutator.SetTrigger(StateTrigger.Approve);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;} &lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;font size="3" face="Calibri"&gt;When control returns to FluentWorkflow, any subsequent entry steps dependent on the
&lt;strong&gt;AutoApproveProcessor&lt;/strong&gt; will not be run and the trigger will be applied to the state machine. This will initiate the state exit steps on the current step and raise the entry states on the next state.&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 04 Jan 2011 07:43:06 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Creating Mutatable Entry Tasks 20110104074306A</guid></item><item><title>Updated Wiki: Design Goals</title><link>http://fluentworkflow.codeplex.com/wikipage?title=Design Goals&amp;version=2</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;FluentWorkflow is built with &lt;a href="http://en.wikipedia.org/wiki/Solid_(object-oriented_design)" target="_blank"&gt;
SOLID principles&lt;/a&gt; in mind from the ground up.&amp;#160;&amp;#160; This focus has lent itself to the ability to create state tasks that are very focused and, through dependency injection, extremely powerful.&lt;/p&gt;
&lt;p&gt;FluentWorkflow is built on top of three key/core components:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The System.Composition namespace – this is for core metadata association offered in the .net 4.0 framework.
&lt;/li&gt;&lt;li&gt;&lt;a href="http://stateless.googlecode.com" target="_blank"&gt;stateless&lt;/a&gt; – this is a state engine based on .net 3.5&amp;#43; created&amp;#160;
&lt;a href="http://nblumhardt.com" target="_blank"&gt;Nicholas Blumhardt&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://autofac.googlecode.com" target="_blank"&gt;Autofac&lt;/a&gt; – this is an Inversion of Control container build on .Net3.5&amp;#43; capabilities
&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;FluentWorkflow uses the DSL to generate a symbol table which is&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Evaluated as a transitive closure to make sure state transitions are complete.
&lt;/li&gt;&lt;li&gt;Execution ordering is accomplished using a constraint resolving algorithm.&amp;#160; The algorithm is written entirely in Linq.
&lt;/li&gt;&lt;li&gt;Errors in configuration including cyclical references, incomplete closure and others are raised through exceptions that point you directly to the state step configuration in question.
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Due to the use of Func&amp;lt;..&amp;gt; injection combined with .net4 metadata and the AutofacContrib.Attributed project, the first release of FluentWorkflow is built to work with Autofac 2.4 or greater.&lt;/p&gt;
&lt;p&gt;The dependency on Autofac can be moved when:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Other containers support the types of creation/relation patterns that autofac supports (see
&lt;a href="http://nblumhardt.com/2010/01/the-relationship-zoo/" target="_blank"&gt;The Relationship Zoo&lt;/a&gt;)
&lt;/li&gt;&lt;li&gt;Other containers support System.Composition based metadata storage or another metadata storage mechanism takes its place.
&lt;/li&gt;&lt;/ol&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 04 Jan 2011 06:46:37 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Design Goals 20110104064637A</guid></item><item><title>Updated Wiki: Roadmap to v1.0</title><link>http://fluentworkflow.codeplex.com/wikipage?title=Roadmap to v1.0&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;The following steps need to happen to move from Beta to version 1.0.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Feedback – lets see how this works for others. &lt;/li&gt;&lt;li&gt;Build script completion – building out a build script for the core (fluentworkflow.core and .testhelpers) with version increment and copy of DLLs to the build directory.
&lt;/li&gt;&lt;li&gt;Decision on how to handle the stateless fork with the stateless project. &lt;/li&gt;&lt;li&gt;Integration with Autofac 2.4 &lt;/li&gt;&lt;li&gt;Creation of a NuGet package. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;If you would like to contribute, please contact me via the contact page or email me directly at steve(dot)hebert (at) gmail(dot)com.&lt;/p&gt;
&lt;p&gt;-Steve&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 04 Jan 2011 06:13:19 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Roadmap to v1.0 20110104061319A</guid></item><item><title>Updated Wiki: Home</title><link>http://fluentworkflow.codeplex.com/wikipage?version=35</link><description>&lt;div class="wikidoc"&gt;&lt;b&gt;Project Description&lt;/b&gt;&lt;br /&gt;Fluent workflow is a lightweight DSL used to describe a workflow and it&amp;#39;s discrete action components to an IoC container for light, fast injectable state engine wire up in your application.  &lt;br /&gt;
&lt;h1&gt;Documentation&lt;/h1&gt;&lt;h2&gt;Table of Contents&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Introduction&amp;referringTitle=Home"&gt;Introduction&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=What%20is%20a%20Workflow%3f&amp;referringTitle=Home"&gt;What is a Workflow&amp;#63;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Design%20Goals&amp;referringTitle=Home"&gt;Design Goals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Roadmap%20to%20v1.0&amp;referringTitle=Home"&gt;Roadmap to v1.0&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Creating State Tasks
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=State%20Task%20Design%20Considerations&amp;referringTitle=Home"&gt;State Task Design Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20Exit%20State%20Tasks&amp;referringTitle=Home"&gt;Creating State Exit Tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20State%20Entry%20Tasks&amp;referringTitle=Home"&gt;Creating State Entry Tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20Mutatable%20Entry%20Tasks&amp;referringTitle=Home"&gt;Creating Mutatable Entry Tasks&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Using%20the%20FlowMutator&amp;referringTitle=Home"&gt;Using the FlowMutator&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Entry%20State%20Task%20Info&amp;referringTitle=Home"&gt;Transition Context for Entry Tasks&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Configuring the Workflow
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=An%20Overview%20of%20the%20Configuration%20Process&amp;referringTitle=Home"&gt;An Overview of the Configuration Process&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Setting%20up%20a%20FluentWorkflow%20Module&amp;referringTitle=Home"&gt;Setting up a FluentWorkflow Module and Configuring the Workflow&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=ForWorkflow%28TWorkflow%2c%20TState%29&amp;referringTitle=Home"&gt;ForWorkflow&amp;#40;TWorkflow, TState&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Permit%28TTrigger%2c%20TState%29&amp;referringTitle=Home"&gt;Permit&amp;#40;TTrigger, TState&amp;#41;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnEntry%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnEntry&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnMutatableEntry%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnMutatableEntry&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnExit%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnExit&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Registering%20the%20Fluent%20Workflow%20Module&amp;referringTitle=Home"&gt;Registering the Fluent Workflow Module&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;Understanding the Compilation Exceptions&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Using%20the%20FluentWorkflow%20StateEngine&amp;referringTitle=Home"&gt;Using the FluentWorkflow StateEngine&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Enumerating%20valid%20triggers&amp;referringTitle=Home"&gt;Enumerating valid triggers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Firing%20a%20trigger%20at%20the%20FluentWorkflow%20StateEngine&amp;referringTitle=Home"&gt;Firing a trigger at the FluentWorkflow StateEngine&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 04 Jan 2011 06:07:57 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110104060757A</guid></item><item><title>Updated Wiki: Design Goals</title><link>http://fluentworkflow.codeplex.com/wikipage?title=Design Goals&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;FluentWorkflow is built with &lt;a href="http://en.wikipedia.org/wiki/Solid_(object-oriented_design)" target="_blank"&gt;
SOLID principles&lt;/a&gt; in mind from the ground up.&amp;#160;&amp;#160; This focus has lent itself to the ability to create state tasks that are very focused and, through dependency injection, extremely powerful.&lt;/p&gt;
&lt;p&gt;FluentWorkflow is built on top of three key/core components:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The System.Composition namespace – this is for core metadata association offered in the .net 4.0 framework.
&lt;/li&gt;&lt;li&gt;&lt;a href="http://stateless.googlecode.com" target="_blank"&gt;stateless&lt;/a&gt; – this is a state engine based on .net 3.5&amp;#43; created&amp;#160;
&lt;a href="http://nblumhardt.com" target="_blank"&gt;Nicholas Blumhardt&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://autofac.googlecode.com" target="_blank"&gt;Autofac&lt;/a&gt; – this is an Inversion of Control container build on .Net3.5&amp;#43; capabilities
&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Due to the use of Func&amp;lt;..&amp;gt; injection combined with .net4 metadata and the AutofacContrib.Attributed project, the first release of FluentWorkflow is built to work with Autofac 2.4 or greater.&lt;/p&gt;
&lt;p&gt;The dependency on Autofac can be moved when:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Other containers support the types of creation/relation patterns that autofac supports (see
&lt;a href="http://nblumhardt.com/2010/01/the-relationship-zoo/" target="_blank"&gt;The Relationship Zoo&lt;/a&gt;)
&lt;/li&gt;&lt;li&gt;Other containers support System.Composition based metadata storage or another metadata storage mechanism takes its place.
&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;For my systems, autofac has been extremely functional and met all of our requirements to date.&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 04 Jan 2011 06:06:19 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Design Goals 20110104060619A</guid></item><item><title>Updated Wiki: Home</title><link>http://fluentworkflow.codeplex.com/wikipage?version=34</link><description>&lt;div class="wikidoc"&gt;&lt;b&gt;Project Description&lt;/b&gt;&lt;br /&gt;Fluent workflow is a lightweight DSL used to describe a workflow and it&amp;#39;s discrete action components to an IoC container for light, fast injectable state engine wire up in your application.  &lt;br /&gt;
&lt;h1&gt;Documentation&lt;/h1&gt;&lt;h2&gt;Table of Contents&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Introduction&amp;referringTitle=Home"&gt;Introduction&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=What%20is%20a%20Workflow%3f&amp;referringTitle=Home"&gt;What is a Workflow&amp;#63;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Design%20Goals&amp;referringTitle=Home"&gt;Design Goals&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Creating State Tasks
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=State%20Task%20Design%20Considerations&amp;referringTitle=Home"&gt;State Task Design Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20Exit%20State%20Tasks&amp;referringTitle=Home"&gt;Creating State Exit Tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20State%20Entry%20Tasks&amp;referringTitle=Home"&gt;Creating State Entry Tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20Mutatable%20Entry%20Tasks&amp;referringTitle=Home"&gt;Creating Mutatable Entry Tasks&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Using%20the%20FlowMutator&amp;referringTitle=Home"&gt;Using the FlowMutator&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Entry%20State%20Task%20Info&amp;referringTitle=Home"&gt;Transition Context for Entry Tasks&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Configuring the Workflow
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=An%20Overview%20of%20the%20Configuration%20Process&amp;referringTitle=Home"&gt;An Overview of the Configuration Process&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Setting%20up%20a%20FluentWorkflow%20Module&amp;referringTitle=Home"&gt;Setting up a FluentWorkflow Module and Configuring the Workflow&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=ForWorkflow%28TWorkflow%2c%20TState%29&amp;referringTitle=Home"&gt;ForWorkflow&amp;#40;TWorkflow, TState&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Permit%28TTrigger%2c%20TState%29&amp;referringTitle=Home"&gt;Permit&amp;#40;TTrigger, TState&amp;#41;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnEntry%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnEntry&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnMutatableEntry%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnMutatableEntry&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnExit%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnExit&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Registering%20the%20Fluent%20Workflow%20Module&amp;referringTitle=Home"&gt;Registering the Fluent Workflow Module&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;Understanding the Compilation Exceptions&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Using%20the%20FluentWorkflow%20StateEngine&amp;referringTitle=Home"&gt;Using the FluentWorkflow StateEngine&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Enumerating%20valid%20triggers&amp;referringTitle=Home"&gt;Enumerating valid triggers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Firing%20a%20trigger%20at%20the%20FluentWorkflow%20StateEngine&amp;referringTitle=Home"&gt;Firing a trigger at the FluentWorkflow StateEngine&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 04 Jan 2011 05:30:35 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110104053035A</guid></item><item><title>Updated Wiki: Introduction</title><link>http://fluentworkflow.codeplex.com/wikipage?title=Introduction&amp;version=2</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;FluentWorkflow is a library that allows you to define &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a set of valid states &lt;/li&gt;&lt;li&gt;transitional triggers that define how to move between states &lt;/li&gt;&lt;li&gt;actions that need to be executed when exiting and entering states. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Given these components, FluentWorkflow goes beyond the generic state machine implementation and allows for discrete, interrelated actions to occur upon state change.&amp;#160; In short, this bridges the gap between generic state machines and larger tools like
 Windows Workflow Foundation.&lt;/p&gt;
&lt;p&gt;In order to accomplish this goal, FluentWorkflow provides a simple fluent configuration DSL for describing workflows and also ordering of state actions.&amp;#160; You are also given the ability to do things like ‘auto-progressing’ from one state to another by
 a specific type of task.&amp;#160; &lt;/p&gt;
&lt;p&gt;FluentWorkflow is focused on providing an environment where workflow tasks can be very small and focused.&amp;#160; These tasks can be ordered together to provide complex workflow scenarios that are easy to test, understand and even visuallize (visualization
 coming).&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 04 Jan 2011 05:04:07 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Introduction 20110104050407A</guid></item><item><title>Updated Wiki: What is a Workflow?</title><link>http://fluentworkflow.codeplex.com/wikipage?title=What is a Workflow?&amp;version=2</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;A workflow is a combination of two discrete ideas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A state machine &lt;/li&gt;&lt;li&gt;A set of tasks associated with each state. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;When trying to merge the two concepts into a business application, task responsibilities typically leak into the StateMachine and sometimes the other way around.&amp;#160; This causes the code to deteriorate – becoming difficult to maintain, understand and grow
 to meet changing business requirements.&lt;/p&gt;
&lt;p&gt;Let’s take a typical blog engine where a comment may be moderated.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=fluentworkflow&amp;DownloadId=193621"&gt;&lt;img title="image" border="0" alt="image" src="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=fluentworkflow&amp;DownloadId=193622" width="377" height="387" style="border-right-width:0px; padding-left:0px; padding-right:0px; display:inline; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a clean diagram shows the discrete states in circles and the triggers for each state named in the arrows showing the transition points.&amp;#160;
&lt;/p&gt;
&lt;p&gt;The diagram only captures part of the story, because the business requirements may state&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;When entering the review phase, AutoApprove previously cleared users so their comments don’t have to be reviewed.
&lt;/li&gt;&lt;li&gt;If the review does not result in an AutoApprove, send the blog owner an email requesting a review.
&lt;/li&gt;&lt;li&gt;Keep a history of when the document moved from state to state. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;These are hypothetical requirements and quite simplified but they convey the heart of our point which is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;These tasks have relationships between each other. &lt;/li&gt;&lt;li&gt;They may invoke other transitions. &lt;/li&gt;&lt;li&gt;[The hidden requirement] The business requirements will change over time, so this needs to be flexible.
&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Now let’s look at a diagram that fills out the picture with our business rules:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=fluentworkflow&amp;DownloadId=193623"&gt;&lt;img title="image" border="0" alt="image" src="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=fluentworkflow&amp;DownloadId=193624" width="554" height="570" style="border-right-width:0px; padding-left:0px; padding-right:0px; display:inline; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;Now that we have a graph that conveys the transitions across the state barrier, we can see a couple of key points:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Recording state changes occurs when we leave a state.&amp;#160; This could happen in other ways, but this seems to make the most sense.
&lt;/li&gt;&lt;li&gt;The state persistence is explicit here as the first step – only because it makes sense to save immediately given the rules, but our system should be flexible to change ordering.
&lt;/li&gt;&lt;li&gt;State Change activities could be launched when entering a state. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Based on these requirements,&amp;#160; we can create a DSL that looks like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=fluentworkflow&amp;DownloadId=193638"&gt;&lt;img title="photo (1)" border="0" alt="photo (1)" src="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=fluentworkflow&amp;DownloadId=193639" width="548" height="355" style="border-bottom:0px; border-left:0px; padding-left:0px; padding-right:0px; display:inline; border-top:0px; border-right:0px; padding-top:0px"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Notice that we are defining states, the triggers that can act upon the states and the state tasks that must execute when entering or leaving the states.&amp;#160; Also notice that interrelationships are being defined through the ‘DependsOn’ method – which allows
 for very easy modifications to the ordering of these tasks.&amp;#160; This removes the desire to create ‘Uber-tasks’ that have many ordered responsibilities and instead we can drive to small, discrete tasks that are ordered by FluentWorkflow.&lt;/p&gt;
&lt;p&gt;As you read through the documentation, you will see that the fluent configuration of FluentWorkflow is very close to this conceptual picture.&amp;#160; With this picture, we even have enough information to generate the same graphs above – whether we use these
 for in-application visuals, build-time artifacts or both.&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 04 Jan 2011 04:49:12 GMT</pubDate><guid isPermaLink="false">Updated Wiki: What is a Workflow? 20110104044912A</guid></item><item><title>Updated Wiki: Home</title><link>http://fluentworkflow.codeplex.com/wikipage?version=33</link><description>&lt;div class="wikidoc"&gt;&lt;b&gt;Project Description&lt;/b&gt;&lt;br /&gt;Fluent workflow is a lightweight DSL used to describe a workflow and it&amp;#39;s discrete action components to an IoC container for light, fast injectable state engine wire up in your application.  &lt;br /&gt;
&lt;h1&gt;Documentation&lt;/h1&gt;&lt;h2&gt;Table of Contents&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Introduction&amp;referringTitle=Home"&gt;Introduction&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=What%20is%20a%20Workflow%3f&amp;referringTitle=Home"&gt;What is a Workflow&amp;#63;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Creating State Tasks
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=State%20Task%20Design%20Considerations&amp;referringTitle=Home"&gt;State Task Design Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20Exit%20State%20Tasks&amp;referringTitle=Home"&gt;Creating State Exit Tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20State%20Entry%20Tasks&amp;referringTitle=Home"&gt;Creating State Entry Tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20Mutatable%20Entry%20Tasks&amp;referringTitle=Home"&gt;Creating Mutatable Entry Tasks&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Using%20the%20FlowMutator&amp;referringTitle=Home"&gt;Using the FlowMutator&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Entry%20State%20Task%20Info&amp;referringTitle=Home"&gt;Transition Context for Entry Tasks&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Configuring the Workflow
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=An%20Overview%20of%20the%20Configuration%20Process&amp;referringTitle=Home"&gt;An Overview of the Configuration Process&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Setting%20up%20a%20FluentWorkflow%20Module&amp;referringTitle=Home"&gt;Setting up a FluentWorkflow Module and Configuring the Workflow&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=ForWorkflow%28TWorkflow%2c%20TState%29&amp;referringTitle=Home"&gt;ForWorkflow&amp;#40;TWorkflow, TState&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Permit%28TTrigger%2c%20TState%29&amp;referringTitle=Home"&gt;Permit&amp;#40;TTrigger, TState&amp;#41;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnEntry%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnEntry&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnMutatableEntry%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnMutatableEntry&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnExit%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnExit&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Registering%20the%20Fluent%20Workflow%20Module&amp;referringTitle=Home"&gt;Registering the Fluent Workflow Module&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;Understanding the Compilation Exceptions&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Using%20the%20FluentWorkflow%20StateEngine&amp;referringTitle=Home"&gt;Using the FluentWorkflow StateEngine&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Enumerating%20valid%20triggers&amp;referringTitle=Home"&gt;Enumerating valid triggers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Firing%20a%20trigger%20at%20the%20FluentWorkflow%20StateEngine&amp;referringTitle=Home"&gt;Firing a trigger at the FluentWorkflow StateEngine&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 04 Jan 2011 01:19:12 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110104011912A</guid></item><item><title>Updated Wiki: What is a Workflow?</title><link>http://fluentworkflow.codeplex.com/wikipage?title=What is a Workflow?&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;A workflow is a combination of two discrete ideas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A state machine &lt;/li&gt;&lt;li&gt;A set of tasks associated with each state. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;When trying to merge the two concepts into a business application, task responsibilities typically leak into the StateMachine and sometimes the other way around.&amp;#160; This causes the code to deteriorate – becoming difficult to maintain, understand and grow
 to meet changing business requirements.&lt;/p&gt;
&lt;p&gt;Let’s take a typical blog engine where a comment may be moderated.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=fluentworkflow&amp;DownloadId=193621"&gt;&lt;img title="image" border="0" alt="image" src="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=fluentworkflow&amp;DownloadId=193622" width="377" height="387" style="border-bottom:0px; border-left:0px; padding-left:0px; padding-right:0px; display:inline; border-top:0px; border-right:0px; padding-top:0px"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a clean diagram shows the discrete states in circles and the triggers for each state named in the arrows showing the transition points.&amp;#160;
&lt;/p&gt;
&lt;p&gt;The diagram only captures part of the story, because the business requirements may state&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;When entering the review phase, AutoApprove previously cleared users so their comments don’t have to be reviewed.
&lt;/li&gt;&lt;li&gt;If the review does not result in an AutoApprove, send the blog owner an email requesting a review.
&lt;/li&gt;&lt;li&gt;Keep a history of when the document moved from state to state. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;These are hypothetical requirements and quite simplified but they convey the heart of our point which is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;These tasks have relationships between each other. &lt;/li&gt;&lt;li&gt;They may invoke other transitions. &lt;/li&gt;&lt;li&gt;[The hidden requirement] The business requirements will change over time, so this needs to be flexible.
&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Now let’s look at a diagram that fills out the picture with our business rules:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=fluentworkflow&amp;DownloadId=193623"&gt;&lt;img title="image" border="0" alt="image" src="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=fluentworkflow&amp;DownloadId=193624" width="554" height="570" style="border-bottom:0px; border-left:0px; padding-left:0px; padding-right:0px; display:inline; border-top:0px; border-right:0px; padding-top:0px"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;Now that we have a graph that conveys the transitions across the state barrier, we can see a couple of key points:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Recording state changes occurs when we leave a state.&amp;#160; This could happen in other ways, but this seems to make the most sense.
&lt;/li&gt;&lt;li&gt;The state persistence is explicit here as the first step – only because it makes sense to save immediately given the rules, but our system should be flexible to change ordering.
&lt;/li&gt;&lt;li&gt;State Change activities could be launched when entering a state. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Based on these requirements,&amp;#160; we can create a DSL that looks like this:&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;Notice that we are defining states, the triggers that can act upon the states and the state tasks that must execute when entering or leaving the states.&amp;#160; Also notice that interrelationships are being defined through the ‘DependsOn’ method – which allows
 for very easy modifications to the ordering of these tasks.&amp;#160; This removes the desire to create ‘Uber-tasks’ that have many ordered responsibilities and instead drive to small, discrete tasks that are ordered by FluentWorkflow.&lt;/p&gt;
&lt;p&gt;As you read through the documentation, you will see that the fluent configuration of FluentWorkflow is very close to this conceptual picture.&amp;#160; With this picture, we even have enough information to generate the same graphs above – whether we use these
 for in-application visuals, build-time artifacts or both.&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 04 Jan 2011 01:18:48 GMT</pubDate><guid isPermaLink="false">Updated Wiki: What is a Workflow? 20110104011848A</guid></item><item><title>Updated Wiki: Home</title><link>http://fluentworkflow.codeplex.com/wikipage?version=32</link><description>&lt;div class="wikidoc"&gt;&lt;b&gt;Project Description&lt;/b&gt;&lt;br /&gt;Fluent workflow is a lightweight DSL used to describe a workflow and it&amp;#39;s discrete action components to an IoC container for light, fast injectable state engine wire up in your application.  &lt;br /&gt;
&lt;h1&gt;Documentation&lt;/h1&gt;&lt;h2&gt;Table of Contents&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Introduction&amp;referringTitle=Home"&gt;Introduction&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Going%20Beyond%20the%20State%20Machine&amp;referringTitle=Home"&gt;Going Beyond the State Machine&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Creating State Tasks
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=State%20Task%20Design%20Considerations&amp;referringTitle=Home"&gt;State Task Design Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20Exit%20State%20Tasks&amp;referringTitle=Home"&gt;Creating State Exit Tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20State%20Entry%20Tasks&amp;referringTitle=Home"&gt;Creating State Entry Tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Creating%20Mutatable%20Entry%20Tasks&amp;referringTitle=Home"&gt;Creating Mutatable Entry Tasks&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Using%20the%20FlowMutator&amp;referringTitle=Home"&gt;Using the FlowMutator&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Entry%20State%20Task%20Info&amp;referringTitle=Home"&gt;Transition Context for Entry Tasks&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Configuring the Workflow
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=An%20Overview%20of%20the%20Configuration%20Process&amp;referringTitle=Home"&gt;An Overview of the Configuration Process&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Setting%20up%20a%20FluentWorkflow%20Module&amp;referringTitle=Home"&gt;Setting up a FluentWorkflow Module and Configuring the Workflow&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=ForWorkflow%28TWorkflow%2c%20TState%29&amp;referringTitle=Home"&gt;ForWorkflow&amp;#40;TWorkflow, TState&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Permit%28TTrigger%2c%20TState%29&amp;referringTitle=Home"&gt;Permit&amp;#40;TTrigger, TState&amp;#41;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnEntry%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnEntry&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnMutatableEntry%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnMutatableEntry&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=OnExit%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;OnExit&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=DependsOn%3cTStateTask%3e%28%29&amp;referringTitle=Home"&gt;DependsOn&amp;#60;TStateTask&amp;#62;&amp;#40;&amp;#41;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Registering%20the%20Fluent%20Workflow%20Module&amp;referringTitle=Home"&gt;Registering the Fluent Workflow Module&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;Understanding the Compilation Exceptions&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Using%20the%20FluentWorkflow%20StateEngine&amp;referringTitle=Home"&gt;Using the FluentWorkflow StateEngine&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Enumerating%20valid%20triggers&amp;referringTitle=Home"&gt;Enumerating valid triggers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentworkflow.codeplex.com/wikipage?title=Firing%20a%20trigger%20at%20the%20FluentWorkflow%20StateEngine&amp;referringTitle=Home"&gt;Firing a trigger at the FluentWorkflow StateEngine&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 04 Jan 2011 00:51:08 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110104125108A</guid></item><item><title>Updated Wiki: Introduction</title><link>http://fluentworkflow.codeplex.com/wikipage?title=Introduction&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
&lt;p&gt;FluentWorkflow allows you to define &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a set of valid states &lt;/li&gt;&lt;li&gt;transitional triggers that define how to move between states &lt;/li&gt;&lt;li&gt;the actions that need to be executed when exiting and entering states. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;In short, FluentWorkflow goes beyond the generic state machine implementation and allows for discrete, interrelated actions to occur upon state change.&amp;#160; In short, this bridges the chasm between generic state machines and larger tools like Windows Workflow
 Foundation.&lt;/p&gt;
&lt;p&gt;In order to accomplish this goal, FluentWorkflow provides a simple fluent configuration dsl for describing workflows and also ordering of state actions.&amp;#160; You are also given the ability to do things like ‘auto-progressing’ from one state to another by
 a specific type of task.&amp;#160; &lt;/p&gt;
&lt;p&gt;FluentWorkflow is focused on providing an environment where workflow tasks can be very small and focused.&amp;#160; These tasks can be ordered together to provide complex workflow scenarios that are easy to test, understand and even visuallize (visualization
 coming).&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>sdhebert</author><pubDate>Tue, 04 Jan 2011 00:50:03 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Introduction 20110104125003A</guid></item></channel></rss>