一个自定义的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():该函数是一个回调函数,书签被触发时执行,执行后取消订阅(即通知宿主已触发)。
注意:书签名称必须是唯一的。