First of all, I want to clarify the distinction between what I consider 3 distinct categories of workflow – the terminology is my own:
- Simple workflow. This is one or more workflow rules created within the MSCRM interface, and which do not include custom workflow activities.
- Workflow with custom workflow activities. I’ll explain more about custom workflow activities later in this article; for now the key point is that a custom workflow activity is .Net code that is written to perform functions not possible in simple workflow, and this code can be called from a workflow rule
- Workflows created with the Workflow Designer in Windows Workflow Foundation. It is possible to build workflows outside of the CRM user interface, but I’m not going to include them in this article.
The main characteristics of simple workflows are:
- * Creating a simple workflow involves no code
- Workflows run only on the CRM server – workflow processing is not available within a client that is offline
- Workflows run asynchronously – any data changes made within a workflow rule will not show up immediately within the CRM user interface
- Workflows can be run manually or automatically. The automatic running of workflows is based on several data modification events
- Workflow rules are entity specific
- The state and stage of a workflow instance can be viewed within the CRM user interface by any CRM user with appropriate permissions
Some limitations of workflows are:
- Workflow rules cannot be created for all entities
- Although workflow rules can be triggered by the most common data modification events, there are some events that don’t trigger workflow rules
- * Simple workflows offering limited capability to perform calculations
Characteristics and limitations marked with an asterix (*) do not apply if using custom workflow activities; the others do still apply.
Custom workflow activities
Custom workflow activities allow you to extend the capabilities of workflow rules. Three common uses are to perform calculations on CRM data, to access CRM functionality that is not available in the out-of-the-box workflow activities, and to access external data.
Custom workflow activities are written as .Net assemblies which have to be registered on the CRM server. These assemblies can include information about parameters that can be passed into or out of the activity.
A plugin is .Net code that is registered on the CRM server. A plugin assembly can be registered for one or more steps – these steps correspond to the combination of the message (event), entity and stage. An example of a step would be the Create message for the account entity on the pre-event stage. Registration of the assembly and steps is part of the plugin deployment process, and there is no direct user interaction with plugins
The main characteristics of plugins are:
- They have to be written as .Net code
- Although they typically run on the CRM server, they can be deployed and configured to run on a CRM client that is offline
- They can run either synchronously or asynchronously. If they run synchronously, any data changes made within the plugin will show up immediately within the CRM user interface
- Synchronous plugins can run on either the pre-event or post-event stage. The pre-event stage happens before data is written to the CRM database, and a plugin registered on a pre-event step can cancel the data writing and provide an error message to the user.
- More entities can have plugins registered for them than can have workflow rules
- Plugins can run on more events than can workflow rules. An example is that plugins can run on data retrieval, not just modification events
The main limitations of plugins are:
- Plugins cannot be run manually; they only run on the steps for which they are registered
- There is no user interaction with plugins, other than error messages that might be throw by a synchronous plugin
So, having covered the main characteristics and limitations of simple workflows, custom workflow activities and plugins, when should you choose one or another ? Here are some common scenarios:
What you want to achieve can be done with a simple workflow, and it is acceptable or desirable for this to happen asynchronously and on the server only
In this case I’d go with simple workflows; there’s no point writing code if you don’t have to.
What you want to achieve has to run synchronously
If so, workflow won’t do, so it would have to be a plugin. An alternative could be to use client script, but I don’t intend to complicate this article by including this in any more detail
You need to be able to cancel the data operation
A pre-event plugin is the only option covered here, though again client script should be considered
You want to give users the discretion to run the operation manually
Here you’ll need a workflow. Whether or not you need a custom workflow activity depends on the complexity of the operations. Again, there may be an option outside of the scope of this article – to write an ASP .Net application that is called from an ISV Config button
You need to write custom code, but you want users to decide whether this code should run, and under what circumstances
In this case I’d go with a custom workflow activity, as you could make this available for users to add to their own workflows
There is more detail about how to write and deploy plugins and custom workflow assemblies within the CRM 4.0 SDK, though unfortunately there’s not a lot of information about when to choose one or the other.
The classroom training material ‘Extending Microsoft Dynamics CRM 4.0’, course number 8969, should have more information both about building plugins and custom workflow assemblies, and when to use them. This course will also cover other solution technologies such as client script and ASP .Net extensions.
One of the MS team, Humberto Lezama has also produced a useful matrix indicating the relative merits of workflow and plugins. This can be found here