예제 #1
0
        static SendReplyDesigner()
        {
            AttributeTableBuilder builder = new AttributeTableBuilder();
            Type sendType = typeof(SendReply);

            builder.AddCustomAttributes(sendType, sendType.GetProperty("CorrelationInitializers"), PropertyValueEditor.CreateEditorAttribute(typeof(CorrelationInitializerValueEditor)));

            var categoryAttribute = new CategoryAttribute(EditorCategoryTemplateDictionary.Instance.GetCategoryTitle(CorrelationsCategoryLabelKey));

            builder.AddCustomAttributes(sendType, sendType.GetProperty("CorrelationInitializers"), categoryAttribute, BrowsableAttribute.Yes,
                                        PropertyValueEditor.CreateEditorAttribute(typeof(CorrelationInitializerValueEditor)));

            categoryAttribute = new CategoryAttribute(EditorCategoryTemplateDictionary.Instance.GetCategoryTitle(MiscellaneousCategoryLabelKey));

            builder.AddCustomAttributes(sendType, sendType.GetProperty("DisplayName"), categoryAttribute);
            var descriptionAttribute = new DescriptionAttribute(StringResourceDictionary.Instance.GetString("messagingValueHint", "<Value to bind>"));

            builder.AddCustomAttributes(sendType, sendType.GetProperty("Content"), categoryAttribute, descriptionAttribute, PropertyValueEditor.CreateEditorAttribute(typeof(SendContentPropertyEditor)));
            builder.AddCustomAttributes(sendType, sendType.GetProperty("Request"),
                                        categoryAttribute,
                                        PropertyValueEditor.CreateEditorAttribute(typeof(ActivityXRefPropertyEditor)));

            var advancedAttribute = new EditorBrowsableAttribute(EditorBrowsableState.Advanced);

            builder.AddCustomAttributes(sendType, sendType.GetProperty("Action"), categoryAttribute, advancedAttribute);

            Action = sendType.GetProperty("Action").Name;

            Type sendMessageContentType = typeof(SendMessageContent);

            Message             = sendMessageContentType.GetProperty("Message").Name;
            DeclaredMessageType = sendMessageContentType.GetProperty("DeclaredMessageType").Name;

            MetadataStore.AddAttributeTable(builder.CreateTable());

            Func <Activity, IEnumerable <ArgumentAccessor> > argumentAccessorGenerator = (activity) => new ArgumentAccessor[]
            {
                new ArgumentAccessor
                {
                    Getter = (ownerActivity) =>
                    {
                        SendReply          sendReply = (SendReply)ownerActivity;
                        SendMessageContent content   = sendReply.Content as SendMessageContent;
                        return(content != null ? content.Message : null);
                    },
                    Setter = (ownerActivity, arg) =>
                    {
                        SendReply          sendReply = (SendReply)ownerActivity;
                        SendMessageContent content   = sendReply.Content as SendMessageContent;
                        if (content != null)
                        {
                            content.Message = arg as InArgument;
                        }
                    },
                },
            };

            ActivityArgumentHelper.RegisterAccessorsGenerator(sendType, argumentAccessorGenerator);
        }
예제 #2
0
 private void SendButton_Click(object sender, RoutedEventArgs e)
 {
     if (string.IsNullOrEmpty(ReplyBox.Text))
     {
         new TipPopup("回复不能为空").ShowError();
         return;
     }
     SendReply?.Invoke(this, ReplyBox.Text);
 }
        internal static Activity GenerateActivity(OperationDescription operation)
        {
            if (operation == null)
            {
                throw FxTrace.Exception.ArgumentNull("operation");
            }

            Receive receive = Receive.FromOperationDescription(operation);

            receive.DisplayName = receive.OperationName + ReceiveSuffix;
            IEnumerable <SendReply> faultReplies;
            SendReply reply = SendReply.FromOperationDescription(operation, out faultReplies);

            if (reply != null)
            {
                reply.DisplayName = receive.OperationName + SendReplySuffix;
                Variable <CorrelationHandle> handle = new Variable <CorrelationHandle> {
                    Name = "__handle"
                };
                receive.CorrelationInitializers.Add(new RequestReplyCorrelationInitializer {
                    CorrelationHandle = new InArgument <CorrelationHandle>(handle)
                });
                reply.Request = receive;

                Activity replyActivity = reply;

                Switch <string> replySelector = null;
                foreach (SendReply faultReply in faultReplies)
                {
                    if (replySelector == null)
                    {
                        replySelector = new Switch <string>
                        {
                            Default = reply
                        };
                        replyActivity = replySelector;
                    }

                    faultReply.Request = receive;
                    string faultName = faultReply.DisplayName.Substring(0, faultReply.DisplayName.Length - SendFaultReply.Length);
                    faultReply.DisplayName = receive.OperationName + SendFaultReplySuffix;
                    replySelector.Cases.Add(faultName, faultReply);
                }

                return(new Sequence
                {
                    DisplayName = receive.OperationName + ReceiveAndSendReplySuffix,
                    Variables = { handle },
                    Activities = { receive, replyActivity },
                });
            }
            else
            {
                return(receive);
            }
        }
예제 #4
0
        /// <summary>
        /// Create activity metadata
        /// </summary>
        /// <param name="metadata">Metadata</param>
        protected override void CacheMetadata(NativeActivityMetadata metadata)
        {
            // Create receive
            _receive = CreateReceive();

            // Create sendreplay
            _sendReply = CreateSendReplay();

            // Set up the activity metadata
            SetupMetadata(metadata);
        }
예제 #5
0
 public OperationScope() : base()
 {
     assigns   = new Collection <Assign>();
     variables = new Collection <Variable>();
     receive   = new Receive()
     {
         Content = new ReceiveParametersContent()
     };
     reply = new SendReply()
     {
         Request = receive,
         Content = new SendParametersContent()
     };
 }
예제 #6
0
        public Initiate()
        {
            this.Implementation = () =>
            {
                var workflowInstanceId = new Variable <string>("workflowInstanceId");

                var readWorkflowInstanceId = new ReadWorkflowInstanceId
                {
                    Result = new OutArgument <string>(workflowInstanceId),
                };

                var receive = new Receive
                {
                    CanCreateInstance   = true,
                    OperationName       = "Initiate",
                    ServiceContractName = this.ServiceContractName,
                    Content             = new ReceiveParametersContent(),
                    SerializerOption    = SerializerOption.DataContractSerializer,
                };

                var reply = new SendReply
                {
                    Request = receive,
                    Content = new SendParametersContent
                    {
                        Parameters =
                        {
                            { "instanceId", new InArgument <string>(workflowInstanceId) },
                        },
                    },
                };

                var performTransactedReceive = new TransactedReceiveScope
                {
                    Request = receive,
                    Body    = reply
                };

                return(new Sequence
                {
                    Variables = { workflowInstanceId, },
                    Activities =
                    {
                        readWorkflowInstanceId,
                        performTransactedReceive,
                    },
                });
            };
        }
예제 #7
0
        /// <summary>
        /// Create SendReplay
        /// </summary>
        /// <returns>SendReply activity</returns>
        private SendReply CreateSendReplay()
        {
            _sendReply = _sendReply ?? new SendReply();
            var parameters = new SendParametersContent();

            parameters.Parameters["response"] = new InArgument <TResponse>(_response);
            _sendReply.Content = parameters;
            _sendReply.Request = _receive;
            if (GenerateCorrelationId && UseContentCorrelation)
            {
                _sendReply.CorrelationInitializers.Clear();
                _sendReply.CorrelationInitializers.Add(
                    new QueryCorrelationInitializer
                {
                    CorrelationHandle = CorrelationHandle,
                    MessageQuerySet   = _correlationOn,
                }
                    );
            }

            return(_sendReply);
        }
예제 #8
0
         public Activity Create(System.Windows.DependencyObject target)
        {
        
           // _service = CustomUnityContainer.Container.Resolve<IService<CR>>();
            // Sequence container.
            var sequence = new Sequence();
            sequence.DisplayName = "Update Task";

            // Correlation Handle.
            var handle = new Variable<CorrelationHandle>("_handle");
            var workItem = new Variable<Task>("_workItemTask");

            // Get variable collection.
            var variables = GetVariableCollection(target);

            if (variables == null)
            {
                sequence.Variables.Add(handle);
                sequence.Variables.Add(workItem);
            }
            else
            {
                handle = AddVariable<CorrelationHandle>(variables, handle);
                workItem = AddVariable<Task>(variables, workItem);
            }

            // Create Receive Activity.
            var receive = new Receive();
            receive.DisplayName = "Update Task Receive";
            receive.Action = "http://tempuri.org/IPILCRWorkflowService/UpdateTask";
            receive.OperationName = "UpdateTask";
            receive.ProtectionLevel = ProtectionLevel.None;
            receive.ServiceContractName = "IPILCRWorkflowService";

            // Add parameters to Receive
            var parameters = new ReceiveParametersContent();
            parameters.Parameters.Add("workItem", new OutArgument<Task>(workItem));
            receive.Content = parameters;

            // Add CorrelationInitializer to Receive
            var initializer = new RequestReplyCorrelationInitializer();
            initializer.CorrelationHandle = new InArgument<CorrelationHandle>(handle);
            receive.CorrelationInitializers.Add(initializer);

            // Create SendReply Activity
            var send = new SendReply();
            send.DisplayName = "Update Reply";
            send.Action = "http://tempuri.org/IPILCRWorkflowService/UpdateTaskResponse";
            send.Request = receive;
            send.PersistBeforeSend = true;

            // Add parameters to SendReply
            var sendParameters = new SendParametersContent();
            sendParameters.Parameters.Add("UpdateResponseResult", new InArgument<Task>(workItem));
            send.Content = sendParameters;

            // Create Create activity.
            UpdateTask activty = new UpdateTask();
            activty.DisplayName = "UpdateTask";
            activty.WorkItem = workItem;

            // Add activities to sequence.
            sequence.Activities.Add(receive);
            sequence.Activities.Add(activty);
            sequence.Activities.Add(send);

            return sequence;
        
        }
예제 #9
0
        static SendReply CreateSendReply(ModelItem target, object context)
        {
            SendReply reply   = null;
            ModelItem receive = (ModelItem)context;

            if (null != receive)
            {
                Receive receiveInstance = (Receive)receive.GetCurrentValue();
                string  name            = null;
                //if no correlation is set - create one
                if (null == receiveInstance.CorrelatesWith)
                {
                    Variable handleVariable = null;
                    //first, look for nearest variable scope
                    ModelItemCollection variableScope = VariableHelper.FindRootVariableScope(receive).GetVariableCollection();
                    if (null != variableScope)
                    {
                        ModelItemCollection correlations = receive.Properties["CorrelationInitializers"].Collection;
                        bool hasRequestReplyHandle       = false;
                        foreach (ModelItem item in correlations)
                        {
                            if (item.ItemType.IsAssignableFrom(typeof(RequestReplyCorrelationInitializer)))
                            {
                                hasRequestReplyHandle = true;
                                break;
                            }
                        }

                        if (!hasRequestReplyHandle)
                        {
                            //create unique variable name
                            name = variableScope.CreateUniqueVariableName("__handle", 1);
                            //create variable
                            handleVariable = Variable.Create(name, typeof(CorrelationHandle), VariableModifiers.None);
                            //add it to the scope
                            variableScope.Add(handleVariable);
                            //setup correlation
                            ImportDesigner.AddImport(CorrelationHandleTypeNamespace, receive.GetEditingContext());
                            VariableValue <CorrelationHandle> expression = new VariableValue <CorrelationHandle> {
                                Variable = handleVariable
                            };
                            InArgument <CorrelationHandle> handle = new InArgument <CorrelationHandle>(expression);
                            correlations.Add(new RequestReplyCorrelationInitializer {
                                CorrelationHandle = handle
                            });
                        }
                    }
                }

                reply = new SendReply()
                {
                    DisplayName = string.Format(CultureInfo.CurrentUICulture, "SendReplyTo{0}", receive.Properties["DisplayName"].ComputedValue),
                    Request     = (Receive)receive.GetCurrentValue(),
                };
            }
            else
            {
                MessageBox.Show(
                    (string)StringResourceDictionary.Instance["receiveActivityCreateReplyErrorLabel"] ?? "Source 'Reply' element not found!",
                    (string)StringResourceDictionary.Instance["MessagingActivityTitle"] ?? "Send",
                    MessageBoxButton.OK, MessageBoxImage.Error);
            }
            return(reply);
        }
        public Activity Create(DependencyObject target)
        {
            // Sequence container.
            var sequence = new Sequence();

            sequence.DisplayName = "Reject";

            // Correlation Handle.
            var handle = new Variable <CorrelationHandle>("_handle");
            var leave  = new Variable <Leave>("_leave");

            // Get variable collection.
            var variables = GetVariableCollection(target);

            if (variables == null)
            {
                sequence.Variables.Add(handle);
                sequence.Variables.Add(leave);
            }
            else
            {
                handle = AddVariable <CorrelationHandle>(variables, handle);
                leave  = AddVariable <Leave>(variables, leave);
            }

            // Create Receive Activity.
            var receive = new Receive();

            receive.DisplayName         = "Reject Receive";
            receive.Action              = "http://tempuri.org/ILeaveWorkflowService/Reject";
            receive.OperationName       = "Reject";
            receive.ProtectionLevel     = ProtectionLevel.None;
            receive.ServiceContractName = "ILeaveWorkflowService";

            // Add parameters to Receive
            var parameters = new ReceiveParametersContent();

            parameters.Parameters.Add("leave", new OutArgument <Leave>(leave));
            receive.Content = parameters;

            // Add CorrelationInitializer to Receive
            var initializer = new RequestReplyCorrelationInitializer();

            initializer.CorrelationHandle = new InArgument <CorrelationHandle>(handle);
            receive.CorrelationInitializers.Add(initializer);

            // Create SendReply Activity
            var send = new SendReply();

            send.DisplayName       = "Reject Reply";
            send.Action            = "http://tempuri.org/ILeaveWorkflowService/RejectResponse";
            send.Request           = receive;
            send.PersistBeforeSend = true;

            // Add parameters to SendReply
            var sendParameters = new SendParametersContent();

            sendParameters.Parameters.Add("RejectResponseResult", new InArgument <Leave>(leave));
            send.Content = sendParameters;

            // Create Reject activity.
            Reject reject = new Reject();

            reject.DisplayName = "Reject";
            reject.Leave       = leave;

            // Add activities to sequence.
            sequence.Activities.Add(receive);
            sequence.Activities.Add(reject);
            sequence.Activities.Add(send);

            return(sequence);
        }
        public Activity Create(DependencyObject target)
        {
            // Sequence container.
            var sequence = new Sequence();

            sequence.DisplayName = "Apply";

            // Correlation Handle.
            var handle          = new Variable <CorrelationHandle>("_handle");
            var applyResult     = new Variable <TrainingRequest>("_applyResult");
            var trainingRequest = new Variable <TrainingRequest>("_trainingRequest");

            // Get variable collection.
            var variables = GetVariableCollection(target);

            if (variables == null)
            {
                sequence.Variables.Add(handle);
                sequence.Variables.Add(applyResult);
                sequence.Variables.Add(trainingRequest);
            }
            else
            {
                handle          = AddVariable <CorrelationHandle>(variables, handle);
                applyResult     = AddVariable <TrainingRequest>(variables, applyResult);
                trainingRequest = AddVariable <TrainingRequest>(variables, trainingRequest);
            }

            // Create Receive Activity.
            var receive = new Receive();

            receive.DisplayName         = "Apply Receive";
            receive.Action              = "http://tempuri.org/ITrainingWorkflowService/Apply";
            receive.OperationName       = "Apply";
            receive.ProtectionLevel     = ProtectionLevel.None;
            receive.ServiceContractName = "ITrainingWorkflowService";
            receive.CanCreateInstance   = true;

            // Add parameters to Receive
            var parameters = new ReceiveParametersContent();

            parameters.Parameters.Add("trainingRequest", new OutArgument <TrainingRequest>(trainingRequest));
            receive.Content = parameters;

            // Add CorrelationInitializer to Receive
            var initializer = new RequestReplyCorrelationInitializer();

            initializer.CorrelationHandle = new InArgument <CorrelationHandle>(handle);
            receive.CorrelationInitializers.Add(initializer);

            // Create SendReply Activity
            var send = new SendReply();

            send.DisplayName       = "Apply Reply";
            send.Action            = "http://tempuri.org/ITrainingWorkflowService/ApplyResponse";
            send.Request           = receive;
            send.PersistBeforeSend = true;

            // Add parameters to SendReply
            var sendParameters = new SendParametersContent();

            sendParameters.Parameters.Add("ApplyResponseResult", new InArgument <TrainingRequest>(applyResult));
            send.Content = sendParameters;

            // Create Apply activity.
            Apply apply = new Apply();

            apply.DisplayName     = "Apply";
            apply.ApplyResult     = applyResult;
            apply.TrainingRequest = trainingRequest;

            // Add activities to sequence.
            sequence.Activities.Add(receive);
            sequence.Activities.Add(apply);
            sequence.Activities.Add(send);

            return(sequence);
        }
        static SendReply CreateSendReply(ModelItem target, object context)
        {
            SendReply reply = null;
            ModelItem receive = (ModelItem)context;
            if (null != receive)
            {
                Receive receiveInstance = (Receive)receive.GetCurrentValue();
                string name = null;
                //if no correlation is set - create one
                if (null == receiveInstance.CorrelatesWith)
                {
                    Variable handleVariable = null;
                    //first, look for nearest variable scope 
                    ModelItemCollection variableScope = VariableHelper.FindRootVariableScope(receive).GetVariableCollection();
                    if (null != variableScope)
                    {
                        ModelItemCollection correlations = receive.Properties["CorrelationInitializers"].Collection;
                        bool hasRequestReplyHandle = false;
                        foreach (ModelItem item in correlations)
                        {
                            if (item.ItemType.IsAssignableFrom(typeof(RequestReplyCorrelationInitializer)))
                            {
                                hasRequestReplyHandle = true;
                                break;
                            }
                        }

                        if (!hasRequestReplyHandle)
                        {
                            //create unique variable name
                            name = variableScope.CreateUniqueVariableName("__handle", 1);
                            //create variable
                            handleVariable = Variable.Create(name, typeof(CorrelationHandle), VariableModifiers.None);
                            //add it to the scope
                            variableScope.Add(handleVariable);
                            //setup correlation
                            ImportDesigner.AddImport(CorrelationHandleTypeNamespace, receive.GetEditingContext());
                            VariableValue<CorrelationHandle> expression = new VariableValue<CorrelationHandle> { Variable = handleVariable };
                            InArgument<CorrelationHandle> handle = new InArgument<CorrelationHandle>(expression);
                            correlations.Add(new RequestReplyCorrelationInitializer { CorrelationHandle = handle });
                        }
                    }
                }

                reply = new SendReply()
                {
                    DisplayName = string.Format(CultureInfo.CurrentUICulture, "SendReplyTo{0}", receive.Properties["DisplayName"].ComputedValue),
                    Request = (Receive)receive.GetCurrentValue(),
                };
            }
            else
            {
                MessageBox.Show(
                    (string)StringResourceDictionary.Instance["receiveActivityCreateReplyErrorLabel"] ?? "Source 'Reply' element not found!",
                    (string)StringResourceDictionary.Instance["MessagingActivityTitle"] ?? "Send",
                    MessageBoxButton.OK, MessageBoxImage.Error);
            }
            return reply;
        }
예제 #13
0
파일: program.cs 프로젝트: zhimaqiao51/docs
        private static Activity GetCCWorkflowWithInitializeCorrelationActivity()
        {
            //<snippet4>
            Variable <string>            OrderId       = new Variable <string>();
            Variable <string>            Item          = new Variable <string>();
            Variable <CorrelationHandle> OrderIdHandle = new Variable <CorrelationHandle>();

            InitializeCorrelation OrderIdCorrelation = new InitializeCorrelation
            {
                Correlation     = OrderIdHandle,
                CorrelationData = { { "OrderId", new InArgument <string>(OrderId) } }
            };

            Receive StartOrder = new Receive
            {
                CanCreateInstance   = true,
                ServiceContractName = "IOrderService",
                OperationName       = "StartOrder"
            };

            SendReply ReplyToStartOrder = new SendReply
            {
                Request = StartOrder,
                Content = SendParametersContent.Create(new Dictionary <string, InArgument> {
                    { "OrderId", new InArgument <string>((env) => OrderId.Get(env)) }
                }),
            };

            // Other messaging activities omitted...
            //</snippet4>

            Receive AddItem = new Receive
            {
                ServiceContractName = "IOrderService",
                OperationName       = "AddItem",
                CorrelatesWith      = OrderIdHandle,
                CorrelatesOn        = new MessageQuerySet
                {
                    {
                        "OrderId",
                        new XPathMessageQuery("sm:body()/tempuri:AddItem/tempuri:OrderId")
                    }
                },
                Content = ReceiveParametersContent.Create(new Dictionary <string, OutArgument>
                {
                    { "OrderId", new OutArgument <string>(OrderId) },
                    { "Item", new OutArgument <string>(Item) }
                })
            };

            SendReply ReplyToAddItem = new SendReply
            {
                Request = AddItem,
                Content = SendParametersContent.Create(new Dictionary <string, InArgument> {
                    { "Reply", new InArgument <string>((env) => "Item added: " + Item.Get(env)) }
                }),
            };

            //<snippet5>
            // Construct a workflow using OrderIdCorrelation, StartOrder, ReplyToStartOrder,
            // and other messaging activities.
            Activity wf = new Sequence
            {
                Variables =
                {
                    OrderId,
                    Item,
                    OrderIdHandle
                },
                Activities =
                {
                    // Wait for a new order.
                    StartOrder,
                    // Assign a unique identifier to the order.
                    new Assign <string>
                    {
                        To    = new OutArgument <string>((env) => OrderId.Get(env)),
                        Value = new InArgument <string>((env) => Guid.NewGuid().ToString())
                    },
                    ReplyToStartOrder,
                    // Initialize the correlation.
                    OrderIdCorrelation,
                    // Wait for an item to be added to the order.
                    AddItem,
                    ReplyToAddItem
                }
            };

            //</snippet5>

            return(wf);
        }
예제 #14
0
파일: program.cs 프로젝트: zhimaqiao51/docs
        private static Activity GetCCWorkflow()
        {
            //<snippet1>
            Variable <string>            OrderId       = new Variable <string>();
            Variable <string>            Item          = new Variable <string>();
            Variable <CorrelationHandle> OrderIdHandle = new Variable <CorrelationHandle>();

            Receive StartOrder = new Receive
            {
                CanCreateInstance   = true,
                ServiceContractName = "IOrderService",
                OperationName       = "StartOrder"
            };

            //<snippet2>
            SendReply ReplyToStartOrder = new SendReply
            {
                Request = StartOrder,
                Content = SendParametersContent.Create(new Dictionary <string, InArgument>
                {
                    { "OrderId", new InArgument <string>((env) => OrderId.Get(env)) }
                }),
                CorrelationInitializers =
                {
                    new QueryCorrelationInitializer
                    {
                        CorrelationHandle = OrderIdHandle,
                        MessageQuerySet   = new MessageQuerySet
                        {
                            {
                                "OrderId",
                                new XPathMessageQuery("sm:body()/tempuri:StartOrderResponse/tempuri:OrderId")
                            }
                        }
                    }
                }
            };
            //</snippet2>

            //<snippet3>
            Receive AddItem = new Receive
            {
                ServiceContractName = "IOrderService",
                OperationName       = "AddItem",
                CorrelatesWith      = OrderIdHandle,
                CorrelatesOn        = new MessageQuerySet
                {
                    {
                        "OrderId",
                        new XPathMessageQuery("sm:body()/tempuri:AddItem/tempuri:OrderId")
                    }
                },
                Content = ReceiveParametersContent.Create(new Dictionary <string, OutArgument>
                {
                    { "OrderId", new OutArgument <string>(OrderId) },
                    { "Item", new OutArgument <string>(Item) }
                })
            };
            //</snippet3>

            SendReply ReplyToAddItem = new SendReply
            {
                Request = AddItem,
                Content = SendParametersContent.Create(new Dictionary <string, InArgument>
                {
                    { "Reply", new InArgument <string>((env) => "Item added: " + Item.Get(env)) }
                }),
            };

            // Construct a workflow using StartOrder, ReplyToStartOrder, and AddItem.
            //</snippet1>
            Activity wf = new Sequence
            {
                Variables =
                {
                    OrderId,
                    Item,
                    OrderIdHandle
                },
                Activities =
                {
                    StartOrder,
                    new Assign <string>
                    {
                        To    = new OutArgument <string>((env) => OrderId.Get(env)),
                        Value = new InArgument <string>((env) => Guid.NewGuid().ToString())
                    },
                    ReplyToStartOrder,
                    AddItem,
                    ReplyToAddItem
                }
            };

            return(wf);
        }