一个自定义的NativeActivity

本文介绍一个本人自定义的NativieActivity,该NativieActivity可实现如下功能:

1、 运行时创建OutArgument,并绑定到变量;

2、 使用书签进行活动的触发;

3、 与宿主中的WCF服务进行交互。

代码如下:

public sealed class WaitActivity : NativeActivity
{
//创建了书签的NativeActivity需要返回true
protected override bool CanInduceIdle
{
get { return true; }
}

public List<OutParameterInfo> OutParameters { get; set; }

public string BookmarkName { get; set; }

public Dictionary<string, OutArgument> OutArguments { get; set; }

public WaitActivity()
{

}

public WaitActivity(Guid ID)
{
if (ID != null)
{
BookmarkName = "Bookmark" + ID.ToString();
}
OutParameters = new List<OutParameterInfo>();
OutArguments = new Dictionary<string, OutArgument>();
}

protected override void CacheMetadata(NativeActivityMetadata metadata)
{
if (OutParameters != null)
{
foreach (OutParameterInfo item in OutParameters)
{
//根据item.ValueType标识的类型创建一个输出参数
try
{
Type valueType = Type.GetType(item.ValueType);
Type typeOutArgument = typeof(OutArgument<>).MakeGenericType(valueType);
Type typeVariable = typeof(VisualBasicReference<>).MakeGenericType(valueType);
var variable = Activator.CreateInstance(typeVariable, item.Name);

//将与item.Name同名的变量与该输出参数相关联
//OutArgument outArg = Activator.CreateInstance(typeOutArgument,
// new VisualBasicReference<int> { ExpressionText = item.Name }) as OutArgument;
OutArgument outArg = Activator.CreateInstance(typeOutArgument, variable) as OutArgument;

if (outArg != null)
{
OutArguments.Add(item.FieldName, outArg);
}
}
catch (System.Exception ex)
{
}
}
}

base.CacheMetadata(metadata);
}


protected override void Execute(NativeActivityContext context)
{
context.CreateBookmark(BookmarkName, new BookmarkCallback(OnBookmarkResumed));
MessageBox.Show("WaitActivity is running" + context.WorkflowInstanceId);
ChannelFactory<IPlanDispatchService> channelFactory = new ChannelFactory<IPlanDispatchService>("PlanDispatchEndpoint");
IPlanDispatchService planDispatchService = channelFactory.CreateChannel();
planDispatchService.Subscribe(context.WorkflowInstanceId, BookmarkName);
}

private void OnBookmarkResumed(NativeActivityContext context, Bookmark bookmark, object obj)
{
MessageBox.Show("已触发");
if (obj is DTO)
{
var myProps = typeof(DTO).GetProperties();
foreach (KeyValuePair<string, OutArgument> item in OutArguments)
{
var propItem = myProps.FirstOrDefault(param => param.Name == item.Key);
var propVal = propItem.GetValue(obj as DTO, null);
item.Value.Set(context, propVal);
}
ChannelFactory<IPlanDispatchService> channelFactory = new ChannelFactory<IPlanDispatchService>("PlanDispatchEndpoint");
IPlanDispatchService planDispatchService = channelFactory.CreateChannel();
planDispatchService.UnSubscribe(context.WorkflowInstanceId, BookmarkName);
}
}

public void AddOutParameter(OutParameterInfo parameterInfo)
{
OutParameters.Add(parameterInfo);
}
}

下面对几个重要的函数给出解释:

CacheMetadata():该函数在运行时执行,主要作用为根据设计时保存在OutParameters中的数据,创建对应的OutArgument参数,并将该OutArgument参数绑定到同名的变量,

提供给其他活动使用。

Execute():该函数中会创建一个书签,然后通知宿主书签的名称和所在运行时实例的ID,以便于宿主在合适的时候触发该书签,以使流程继续执行。

OnBookmarkResumed():该函数是一个回调函数,书签被触发时执行,执行后取消订阅(即通知宿主已触发)。

注意:书签名称必须是唯一的。

posted on 2011-12-21 19:35  顾文锦  阅读(1218)  评论(2编辑  收藏  举报