2010-12-01 5 views
3

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

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

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

ответ

6

Я не делал этого, используя составную активность 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); 
    } 
} 
+0

Хороший пример. Спасибо Морису! Вы действительно должны рассмотреть возможность написания книги по этому вопросу ... – TrueWill 2010-12-02 17:18:24

Смежные вопросы