Установка внутренних свойств в композитном WF4 Действия во время разработки
Я хочу создать составное действие рабочего процесса Windows (в.NET 4), которое содержит предопределенное действие ReceiveAndSendReply. Некоторые свойства предопределены, но другие (в частности, ServiceContractName) должны быть установлены в конструкторе.
Я мог бы реализовать это как шаблон деятельности (так же, как реализован ReceiveAndSendReply), но лучше бы этого не было. Если я позже изменю шаблон, мне придется обновить все ранее созданные рабочие процессы вручную. Шаблон также позволит другим разработчикам изменять свойства, которые должны быть исправлены.
Есть ли способ сделать это из Xaml Activity? Я не нашел способ присвоить значение аргумента свойству встроенной деятельности. Если нет, какую технику вы бы предложили?
1 ответ
Я не делал этого с использованием составного действия 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);
}
}