Posts Tagged ‘WF4.0’

If your Activities OutArgument is something complex,say List<string> for eg,then you need to initialize it first & If you don’t do so,you will get an exception The property ‘Collection’ of ‘AddToCollection<String>’ is not initialized.

For assigning default value to the variable,you can use the assign activity & initialize it to New List(Of String).Though your language is C#,if you look at,you will understand that the initialization to variable is a VB expression ! It’s not a big deal to write an expression in VB ,still I wonder why is it so when the project is C# :)If you know the answer,please share  that in the comments section below 🙂

Advertisements

WorkflowInvoker class provides a means for invoking a workflow as if it were a method call.

Namespace:System.Activities
Assembly:System.Activities (in System.Activities.dll)

A custom activity example which we will call using WorkFlowInvoker :

public sealed class SendEmailActivity : CodeActivity
{

[RequiredArgument]
public InArgument Subject { get; set; }

[RequiredArgument]
public InArgument Body { get; set; }

[RequiredArgument]
public InArgument To { get; set; }

[RequiredArgument]
public InArgument From { get; set; }

protected override void Execute(CodeActivityContext context)
{
// Obtain the runtime value of the Subject input argument
string text = context.GetValue(this.Subject);
}
}

Invokes SendEmailActivity :
public void TestSendEmailActivity()
{

WorkflowInvoker invoker = new WorkflowInvoker(
new SendEmailActivity
{
From = "Anupama_roy@testmail.com",
To = "Anupama_roy@testmail.com",
Subject = "Hello",
Body="How are you?"

});

invoker.Invoke();

}

This article gives a basic idea of how to create a custom activity in WF 4 deriving from CodeActivity.Steps below demonstrates how to do this.

• Open a New Project in vs2010,Choose WCF WorkFlow Service Application

• You can see Service1.xamlx added.Rename Service1.xamlx to Operation.xamlx

• Now Add a class to this project & name it as OperationActivity.cs

• Add namespace using System.Activities; to class

• Derive Class from CodeActivity

public class OperationActivity:CodeActivity
• Add In & Out arguments

[RequiredArgument]
public InArgument From { get; set; }
public OutArgument CallCount { get; set; }

Write the below code & compile. What this activity does is, takes an InArgument of type string. If it is not empty, increase the counter set and assign it to OutArgument CallCount.

namespace Anupama_s_WF_Sample
{
public class OperationActivity:CodeActivity
{

[RequiredArgument]
public InArgument From { get; set; }
public OutArgument CallCount { get; set; }
protected override void Execute(CodeActivityContext context)
{

try
{

string text = context.GetValue(this.From);
int count=0;
if (!string.IsNullOrEmpty(text))
{
count++;
context.SetValue(this.CallCount,count);

}

}
catch (Exception ex)
{
throw;
}
}

}
}

Now Open xamlx designer, you see two Activities added by default

1.ReceiveRequest

Receives the request from user

2.SendResponse

Sends result back to user

Open Tool Box as you see in the snapshot, you can see the compiled custom activity OperationActivity which you created now. Drag & drop as shown in snapshot.

It shows a validation symbol highlighted in red .It means value for the arguments are not supplied

• For this you have to add a variable

• Name variable as “From” .Set the variable type as string

• Click on receive request activity

Against Content,You can see View parameter.Click on it.It will open a dialog box.Click on Parameters radio button.Add new parameter FromInput & assign it to the previously created variable “From”.Click ok

• Select Operation Activity,Right Click to see properties.


• Against From in properties window,select the From variable declared.

• What we have done is,ReceiveRequest activity takes the input from user,assigns it to From variable & Operation activity utilizes the value from common variable set.

• We need one more variable to pass the output from custom activity to SendResponse activity

• Create variable Result of type int

• Assign Operation activity CallCount to Result,Add this Result as the input parameter to SendResponse activity.

Look at the designer now, you can see that all validation errors are disappeared as we satisfied the input & output requirements by assigning to appropriate variables.

Hope you got the basic idea of how to create a custom activity deriving from CodeActivity.