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); }
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); } }
/// <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); }
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() }; }
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, }, }); }; }
/// <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); }
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; }
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; }
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); }
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); }