Пользовательская последовательность действий рабочего процесса Windows - PullRequest
1 голос
/ 23 сентября 2011

Я работаю с Windows Workflow 4, и мне нужно создать действие C #, которое, в основном, наследуется от действия Sequence. Я хочу, чтобы это выглядело как действие Sequence, чтобы пользователь мог перетаскивать на него другие действия из конструктора. Но он действует по-разному в коде (может быть, я хочу запустить их в другом порядке или выполнять специальные действия между ними, это не должно иметь значения).

Как я могу это сделать? Я вижу, подобный вопрос был задан по этому поводу, и только один человек ответил предложением, которое относится только к Windows Workflow 3. В версии 4 последовательность действий не может быть унаследована, по меньшей мере .

Это не похоже на надуманную концепцию. Действие Sequence предоставляется как встроенное действие. Таким образом, кажется логичным, что он должен быть воспроизводимым или, по крайней мере, наследуемым, поэтому у меня может быть настроенная версия действия Sequence.

У кого-нибудь есть идеи?

1 Ответ

5 голосов
/ 29 сентября 2011

Конструктор "System.Activities.Core.Presentation.SequenceDesigner" уже доступен в WF 4. Затем можно составить действие Sequence и использовать этот конструктор для внешнего класса.

Вот рабочий пример:

using System.Activities;
using System.Activities.Statements;
using System.Collections.ObjectModel;
using System.ComponentModel;

[Designer("System.Activities.Core.Presentation.SequenceDesigner, System.Activities.Core.Presentation")]
public class MySeq : NativeActivity
{
    private Sequence innerSequence = new Sequence();

    [Browsable(false)]
    public Collection<Activity> Activities
    {
        get
        {
            return innerSequence.Activities;
        }
    }

    [Browsable(false)]
    public Collection<Variable> Variables
    {
        get
        {
            return innerSequence.Variables;
        }
    }

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        metadata.AddImplementationChild(innerSequence);
    }

    protected override void Execute(NativeActivityContext context)
    {
        context.ScheduleActivity(innerSequence);
    }

}

Это перенаправляет реальное поведение на закрытую innerSequence, что может сделать этот код бесполезным, но обратите внимание, что в методе Execute он дает нам возможность делать что-то до и после выполнения. Если мы хотим обеспечить настраиваемое поведение, мы должны были бы реализовать его вместо перенаправления на внутреннюю частную деятельность.

...