Настройка внутренних свойств в композитном WF4 Действия во время разработки - PullRequest
3 голосов
/ 02 декабря 2010

Я хочу создать составное действие рабочего процесса Windows (в .NET 4), которое содержит предопределенное действие ReceiveAndSendReply. Некоторые свойства предопределены, но другие (в частности, ServiceContractName) необходимо установить в конструкторе.

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

Есть ли способ сделать это из Xaml Activity? Я не нашел способ присвоить значение аргумента свойству встроенной деятельности. Если нет, какую технику вы бы предложили?

1 Ответ

6 голосов
/ 02 декабря 2010

Я не делал этого с помощью составного действия XAML и получаю некоторые ошибки, когда пытаюсь это сделать, но с помощью NativeActivity проблем не возникает. Смотрите пример кода ниже.

public class MyReceiveAndSendReply : NativeActivity
{
    private Receive _receive;
    private SendReply _sendReply;

    public string ServiceContractName { get; set; }
    public string OperationName { get; set; }

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

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        _receive = _receive ?? new Receive();
        _sendReply = _sendReply ?? new SendReply();
        _receive.CanCreateInstance = true;
        metadata.AddImplementationChild(_receive);
        metadata.AddImplementationChild(_sendReply);

        _receive.ServiceContractName = ServiceContractName;
        _receive.OperationName = OperationName;

        var args = new ReceiveParametersContent();
        args.Parameters["firstName"] = new OutArgument<string>();
        _receive.Content = args;

        _sendReply.Request = _receive;

        var results = new SendParametersContent();
        results.Parameters["greeting"] = new InArgument<string>("Hello there");
        _sendReply.Content = results;

        base.CacheMetadata(metadata);
    }

    protected override void Execute(NativeActivityContext context)
    {
        context.ScheduleActivity(_receive, ReceiveCompleted);

    }

    private void ReceiveCompleted(NativeActivityContext context, ActivityInstance completedInstance)
    {
        context.ScheduleActivity(_sendReply);
    }
}
...