Что я делаю не так с моим триггером выбора закладок Workflow? - PullRequest
1 голос
/ 30 июня 2010

Я написал производное действие NativeActivity, которое заключается в использовании закладок в качестве триггера для ветви выбора.Используя что-то, что я нашел в MSDN, я попытался написать это, чтобы вызвать ветку.Ветвь содержит действия, которые запускают обратные вызовы службы для удаленных клиентов через действия отправки.Если я установлю задержку для триггера, обратные вызовы будут срабатывать для клиентов успешно.Если я использую свою активность кода, действия ветви выбора не запускаются.

public sealed class UpdateListener : NativeActivity<ClientUpdate>
{
    [RequiredArgument]
    public InArgument<string>     BookmarkName { get; set; }

    protected override void Execute(NativeActivityContext context)
    {
        context.CreateBookmark(BookmarkName.Get(context),
                    new BookmarkCallback(this.OnResumeBookmark));
    }


    protected override bool CanInduceIdle
    {
        get { return true; }
    }


    public void OnResumeBookmark(NativeActivityContext context, Bookmark bookmark, object obj )
    {
        Result.Set(context, (ClientUpdate)obj);
    }
}

Поэтому для задания имени закладки для будущих ссылок на закладки требуется выполнить аргумент.OnResumeBoookmark () принимает объект ClientUpdate, который передается моим приложением, в котором размещается приложение workflow.Действие состоит в том, чтобы вернуть объект, чтобы ClientUpdate можно было передать в рабочий процесс и отправить его удаленным клиентам через действие отправки в ветви выбора.В любом случае, теоретически.

По какой-то причине это кажется правильным, но кажется неправильным.Я не уверен, стоит ли мне писать «Упражнение» по-другому, чтобы позаботиться о том, что мне нужно для моей службы WF.

Ответы [ 2 ]

1 голос
/ 22 июля 2010

Я думаю, что ваши намерения будут немного яснее, если вы создадите расширение (которое реализует IWorkflowInstanceExtension) для выполнения ваших действий здесь.

Например:

public sealed class AsyncWorkExtension 
    : IWorkflowInstanceExtension
{
    // only one extension per workflow
    private WorkflowInstanceProxy _proxy;
    private Bookmark _lastBookmark;

    /// <summary>
    /// Request the extension does some work for an activity
    /// during which the activity will idle the workflow
    /// </summary>
    /// <param name="toResumeMe"></param>
    public void DoWork(Bookmark toResumeMe)
    {
        _lastBookmark = toResumeMe;
        // imagine I kick off some async op here
        // when complete system calls WorkCompleted below
        // NOTE:  you CANNOT block here or you block the WF!
    }

    /// <summary>
    /// Called by the system when long-running work is complete
    /// </summary>
    /// <param name="result"></param>
    internal void WorkCompleted(object result)
    {
        //NOT good practice!  example only
        //this leaks resources search APM for details
        _proxy.BeginResumeBookmark(_lastBookmark, result, null, null);
    }

    /// <summary>
    /// When implemented, returns any additional extensions 
    /// the implementing class requires.
    /// </summary>
    /// <returns>
    /// A collection of additional workflow extensions.
    /// </returns>
    IEnumerable<object> IWorkflowInstanceExtension
        .GetAdditionalExtensions()
    {
        return new object[0];
    }

    /// <summary>
    /// Sets the specified target 
    /// <see cref="WorkflowInstanceProxy"/>.
    /// </summary>
    /// <param name="instance">The target workflow instance to set.</param>
    void IWorkflowInstanceExtension
        .SetInstance(WorkflowInstanceProxy instance)
    {
        _proxy = instance;
    }
}

В Деятельности вы бы использовали это так:

 var ext = context.GetExtension<AsyncWorkExtension>();
 var bookmark = context.CreateBookmark(BookmarkCallback);
 ext.DoWork(bookmark);
 return;

Этот способ гораздо более явный (вместо использования имени закладки для передачи значения «внешнему» миру) и его гораздо проще расширить, если, скажем, вам требуется отправить больше информации, чем имя закладки. *

0 голосов
/ 01 июля 2010

Есть ли что-то на самом деле возобновление закладки здесь? Если нет, рабочий процесс будет очень терпеливо ждать, и ничего не произойдет.

...