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

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

  • 相关阅读:
    golang单例模式
    PHP打开并修改文件
    关于文件服设计的一些想法
    Api
    golang Iterate through the fields of a struct in Go
    zookeeper note
    centos 6 install protoc
    todo
    linux route
    build http_load
  • 原文地址:https://www.cnblogs.com/wenjingu/p/2296212.html
Copyright © 2020-2023  润新知