ApprovaFlow: Where We At?
It’s been a while, and as usual Sensei has started something with such bravado and discovered that life offers more bluster and pounding than even he can anticipate. Hopefully you haven’t given up on the series, ’cause Sensei hasn’t. Hell, ApprovaFlow is constantly on the forefront, even though it appears that he’s taken a good powder.
Let’s recap our goals and talk about philosophy and direction. In this long silence a few additional considerations have taken precedence, and this is a good opportunity to assess goals and re-align the development efforts. In the end ApprovaFlow will:
Model a workflow in a clear format that is readable by both developer and business user. One set of verbiage for all parties. Discussed in Simple Workflows With ApprovaFlow and Stateless.
Allow the state of a workflow to be peristed as an integer, string, etc. Quickly fetch state of a workflow. Discussed in Simple Workflows With ApprovaFlow and Stateless.
Create pre and post processing methods that can enforce enforce rules or carry out actions when completing a workflow task. Discussed inApprovaFlow: Using the Pipe and Filter Pattern to Build a Workflow Processor
• Introduce new functionality while isolating the impact of the new changes. New components should not break old ones
• Communicate to the client with a standard set of objects. In other words, your solution domain will not change how the user interface will gather data from the user.
• Use one. aspx page to processes user input for any type of workflow.
• Provide ability to roll your own customizations to the front end or backend of your application.
The astute members of the audience will no doubt say “What about the technical objectives, like how are you going to store all the workflow data? In flat files? Will you give me alternatives for storage? How will I create the workflows, by using Notepad?” Indeed, Sensei has pondered these issues as well and has accumulated a fair amount failed experiments with some being quite interesting. Given time these little experiments may become posts as well, since there are interesting things to learn from these failures.
The biggest issue is storage. The point of using Stateless was that we wanted flexibility. Recall that the state of our state machine can be represented with a mere integer or string. Makes it pretty easy to store this in a database, or a document. While you could map the Step and Workflow class to tables in SQL our domain is using JSON so it makes sense to gravitate to a storage solution that will easily support that format. ApprovaFlow will use RavenDB as the document database, but will provide the opportunity for you to use a different solution if you wish. You’ll find that RavenDB quite readily provides a document storage format for our workflows that is quite elegant.
As an aside, Sensei experimented with a great alternative to the NoSQL solutions called Sis0DB. This open project provides you that ability to store you object graphs in SQL Server. Time permitting Sensei will share some of his adventures with you regarding this neat project.
While Sensei was off in the weeds learning about RavenDB he discovered that Ayende created a fantastic mechanism for authorizing user actions on documents. This authorization of activity can be a granular as denying / allowing updates to occur based on an operation.
Since we want to adhere to principles of flexibility the Authorization features will be implemented as a plug-in, so if you wish to roll your own mechanisms to govern workflow approvals you will be free to do so.
Yep. Sensei is sick of using Notepad to create JSON documents as well. We want to be able to create the states, the triggers and the target states and save. We’ll want to assign the filters to specific states and save. No more text fiddling. Period. As Sensei is thinking about this, it seems that another pipeline can be created for administration. Luckily we have a plug-in architecture so this should be rather straight forward.
Summing It All Up
These are really important things to consider, and as much as Sensei hates changing goals in mid stream the capabilities discussed above can make life much easier while implementing a workflow system. In making the decision to use RavenDB the thought that “a storage solution should not shape the solution domain” kept raising its ugly maw. But, so what. We want to finish something, and admittedly this has been a challenge – just look at the lag between posts if you need a reminder. If Sensei decided to include an IOC container just to remain “loosely” coupled to document storage we’ll get no where. Would you really want to read those posts? How boring. Besides, Sensei doesn’t know how to do all that stuf – gonna stick to the stuff he thinks he knows. Or at least the stuff he can fake.