In this article we are going to show how to create a Windows Workflow Activity.
Our activity will be called GreetingsActivity and it has the purpose of displaying a Greetings message using the System.Console.WriteLine method.
So the best type of application in which to host the workflow containing such an activity is the Console Application template.
So let’s begin
The first thing to do is to create a library class project that you can call after the name of the Activity : GreetingsActivity. Then add all the required reference for Workflow. Create also some using statements in order to enable you to use shortcut acces to the major classes and namespaces that we will be using
using System;
using System.ComponentModel;
using System.Workflow.Activities;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Design;
After that I create a class which derives from System.Workflow.ComponentModel.Activity class
The main method that we are going to implement is the Execute method. We will override it in order to implement our business logic right in it.
We have also added two properties that are Greeter and Greeted, to enable the activity to receive parameters. These properties are registered through the DependencyProperty class and it’s method Register.
namespace GreetingsActivity
{
///
/// Ma première activité avec Windows Workflow Foundation
/// Il y'en aura sans doute beaucoup
///
[ToolboxItemAttribute(typeof(ActivityToolboxItem))]
public partial class GreetingsActivity:System.Workflow.ComponentModel.Activity
{
public GreetingsActivity()
{
InitializeComponent();
}
protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
// Create an instance of CustomActivityEventArgs
CustomActivityEventArgs customActivityEventArgs = new CustomActivityEventArgs(this.Description);
// raise the BeforeSendEvent event and pass customActivityEventArgs
this.RaiseGenericEvent(BeforeSendEvent, this, customActivityEventArgs);
// This is where the logic of the e-mail should go
Console.WriteLine("Greetings to you all, this is my first activity");
Console.ReadKey();
return ActivityExecutionStatus.Closed;
}
// Create a DependencyProperty BeforeSendEvent and the BeforeSend event handler
public static DependencyProperty BeforeSendEvent = DependencyProperty.Register("BeforeSend", typeof(EventHandler), typeof(GreetingsActivity));
// Create some Dependency properties for the Greeter and the Greeted
public static DependencyProperty GreeterProperty = DependencyProperty.Register("Greeter", typeof(String), typeof(GreetingsActivity));
public static DependencyProperty GreetedProperty = DependencyProperty.Register("Greeted", typeof(String), typeof(GreetingsActivity));
[DescriptionAttribute("Please specify the greeter's name ")]
[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
[ValidationOptionAttribute(ValidationOption.Optional)]
[BrowsableAttribute(true)]
public string Greeter
{
get
{
return ((String)(base.GetValue(GreetingsActivity.GreeterProperty)));
}
set
{
base.SetValue(GreetingsActivity.GreeterProperty, value);
}
}
[DescriptionAttribute("Please specify the greeted's name ")]
[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
[ValidationOptionAttribute(ValidationOption.Optional)]
[BrowsableAttribute(true)]
public string Greeted
{
get
{
return ((String)(base.GetValue(GreetingsActivity.GreetedProperty)));
}
set
{
base.SetValue(GreetingsActivity.GreetedProperty, value);
}
}
[DescriptionAttribute("Use this Handler to do some pre-processing logic ")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[ValidationOption(ValidationOption.Optional)]
[BrowsableAttribute(true)]
[Category("Handlers")]
public event EventHandler BeforeSend
{
add
{
base.AddHandler(GreetingsActivity.BeforeSendEvent, value);
}
remove
{
base.RemoveHandler(GreetingsActivity.BeforeSendEvent, value);
}
}
}
// Create a CustomActivityEventArgs
public class CustomActivityEventArgs : EventArgs
{
public readonly string ActivityDescription;
public CustomActivityEventArgs(string activityDescription)
{
this.ActivityDescription = activityDescription;
}
}
}
Our activity will be called GreetingsActivity and it has the purpose of displaying a Greetings message using the System.Console.WriteLine method.
So the best type of application in which to host the workflow containing such an activity is the Console Application template.
So let’s begin
The first thing to do is to create a library class project that you can call after the name of the Activity : GreetingsActivity. Then add all the required reference for Workflow. Create also some using statements in order to enable you to use shortcut acces to the major classes and namespaces that we will be using
using System;
using System.ComponentModel;
using System.Workflow.Activities;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Design;
After that I create a class which derives from System.Workflow.ComponentModel.Activity class
The main method that we are going to implement is the Execute method. We will override it in order to implement our business logic right in it.
We have also added two properties that are Greeter and Greeted, to enable the activity to receive parameters. These properties are registered through the DependencyProperty class and it’s method Register.
namespace GreetingsActivity
{
///
/// Ma première activité avec Windows Workflow Foundation
/// Il y'en aura sans doute beaucoup
///
[ToolboxItemAttribute(typeof(ActivityToolboxItem))]
public partial class GreetingsActivity:System.Workflow.ComponentModel.Activity
{
public GreetingsActivity()
{
InitializeComponent();
}
protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
// Create an instance of CustomActivityEventArgs
CustomActivityEventArgs customActivityEventArgs = new CustomActivityEventArgs(this.Description);
// raise the BeforeSendEvent event and pass customActivityEventArgs
this.RaiseGenericEvent
// This is where the logic of the e-mail should go
Console.WriteLine("Greetings to you all, this is my first activity");
Console.ReadKey();
return ActivityExecutionStatus.Closed;
}
// Create a DependencyProperty BeforeSendEvent and the BeforeSend event handler
public static DependencyProperty BeforeSendEvent = DependencyProperty.Register("BeforeSend", typeof(EventHandler
// Create some Dependency properties for the Greeter and the Greeted
public static DependencyProperty GreeterProperty = DependencyProperty.Register("Greeter", typeof(String), typeof(GreetingsActivity));
public static DependencyProperty GreetedProperty = DependencyProperty.Register("Greeted", typeof(String), typeof(GreetingsActivity));
[DescriptionAttribute("Please specify the greeter's name ")]
[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
[ValidationOptionAttribute(ValidationOption.Optional)]
[BrowsableAttribute(true)]
public string Greeter
{
get
{
return ((String)(base.GetValue(GreetingsActivity.GreeterProperty)));
}
set
{
base.SetValue(GreetingsActivity.GreeterProperty, value);
}
}
[DescriptionAttribute("Please specify the greeted's name ")]
[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
[ValidationOptionAttribute(ValidationOption.Optional)]
[BrowsableAttribute(true)]
public string Greeted
{
get
{
return ((String)(base.GetValue(GreetingsActivity.GreetedProperty)));
}
set
{
base.SetValue(GreetingsActivity.GreetedProperty, value);
}
}
[DescriptionAttribute("Use this Handler to do some pre-processing logic ")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[ValidationOption(ValidationOption.Optional)]
[BrowsableAttribute(true)]
[Category("Handlers")]
public event EventHandler
{
add
{
base.AddHandler(GreetingsActivity.BeforeSendEvent, value);
}
remove
{
base.RemoveHandler(GreetingsActivity.BeforeSendEvent, value);
}
}
}
// Create a CustomActivityEventArgs
public class CustomActivityEventArgs : EventArgs
{
public readonly string ActivityDescription;
public CustomActivityEventArgs(string activityDescription)
{
this.ActivityDescription = activityDescription;
}
}
}
Commentaires