标签:
//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------- using System; using System.Activities; using System.Configuration; using System.ServiceModel; using System.ServiceModel.Activities; using System.ServiceModel.Activities.Description; using Microsoft.Samples.DocumentApprovalProcess.ApprovalManagerActivityLibrary; namespace Microsoft.Samples.DocumentApprovalProcess.ApprovalManager { class Program { static string ApprovalProcessDBConnectionString = ConfigurationManager.ConnectionStrings["ApprovalProcessDB"].ConnectionString; static void Main(string[] args) { Activity element = new ApprovalRouteAndExecute(); WorkflowService shservice = new WorkflowService { Name = "ApprovalManager", ConfigurationName = "Microsoft.Samples.DocumentApprovalProcess.ApprovalManager.ApprovalManager", Body = element }; // Cleanup old table of users from previous run UserManager.DeleteAllUsers(); ServiceHost sh = new ServiceHost(typeof(Microsoft.Samples.DocumentApprovalProcess.ApprovalManager.SubscriptionManager), new Uri("http://localhost:8732/Design_Time_Addresses/service/SubscriptionManager/")); sh.Open(); System.ServiceModel.Activities.WorkflowServiceHost wsh = new System.ServiceModel.Activities.WorkflowServiceHost(shservice, new Uri("http://localhost:8732/Design_TimeAddress/service/ApprovalManager")); // Setup persistence wsh.Description.Behaviors.Add(new SqlWorkflowInstanceStoreBehavior(ApprovalProcessDBConnectionString)); WorkflowIdleBehavior wib = new WorkflowIdleBehavior(); wib.TimeToUnload = new TimeSpan(0, 0, 2); wsh.Description.Behaviors.Add(wib); wsh.Open(); Console.WriteLine("All services ready, press any key to close the services and exit."); Console.ReadLine(); wsh.Close(); sh.Close(); } } }
//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------- using System.ServiceModel; using Microsoft.Samples.DocumentApprovalProcess.ApprovalMessageContractLibrary; namespace Microsoft.Samples.DocumentApprovalProcess.ApprovalManager { // This service is how clients opt-in/out of the approval system [ServiceContract] interface ISubscriptionService { [OperationContract] User Subscribe(User newuser); [OperationContract] void Unsubscribe(User id); } class SubscriptionManager : ISubscriptionService { public User Subscribe(User newuser) { return UserManager.AddUser(newuser.Name, newuser.Type, newuser.AddressRequest, newuser.AddressResponse); } public void Unsubscribe(User id) { UserManager.RemoveUser(id); } } }
//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------- using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using Microsoft.Samples.DocumentApprovalProcess.ApprovalMessageContractLibrary; namespace Microsoft.Samples.DocumentApprovalProcess.ApprovalManager { // This contains all the SQL code to manage users participating in the approval system public static class UserManager { static String dbconnStr = ConfigurationManager.ConnectionStrings["ApprovalProcessDB"].ConnectionString; public static User AddUser(String uname, String utype, String endaddressrequest, String endaddressresponse) { User newUser = new User(uname, utype, endaddressrequest, endaddressresponse); using (SqlConnection sCon = new SqlConnection(dbconnStr)) { SqlCommand sCom = new SqlCommand(); sCom.Connection = sCon; sCom.CommandText = "insert into users (username,usertype,addressrequest,addressresponse,guid) values(‘" + uname + "‘, ‘" + utype + "‘, ‘" + endaddressrequest + "‘, ‘" + endaddressresponse + "‘, ‘" + newUser.Id + "‘)"; sCon.Open(); sCom.ExecuteNonQuery(); sCon.Dispose(); } return newUser; } public static void RemoveUser(User id) { using (SqlConnection sCon = new SqlConnection(dbconnStr)) { using (SqlCommand sCom = new SqlCommand()) { sCom.Connection = sCon; sCom.CommandText = "DELETE FROM users WHERE guid=‘" + id.Id + "‘"; sCon.Open(); sCom.ExecuteNonQuery(); sCon.Dispose(); } } } public static List<User> GetUsersByType(String utype) { String query = "SELECT * FROM users WHERE usertype=‘" + utype + "‘"; List<User> filteredUsers = new List<User>(); DataSet ds = new DataSet(); using (SqlConnection sCon = new SqlConnection(dbconnStr)) { using (SqlDataAdapter sAda = new SqlDataAdapter(query, sCon)){ sAda.Fill(ds); if (ds.Tables["Table"] != null) { foreach (DataRow dr in ds.Tables["Table"].Rows) { filteredUsers.Add(new User((String)dr["username"], (String)dr["usertype"], (String)dr["address"], (String)dr["guid"])); } } } sCon.Dispose(); } return filteredUsers; } public static void DeleteAllUsers() { using (SqlConnection sCon = new SqlConnection(dbconnStr)) { using (SqlCommand sCom = new SqlCommand()) { sCom.Connection = sCon; sCom.CommandText = "DELETE FROM users"; sCon.Open(); sCom.ExecuteNonQuery(); sCon.Dispose(); } } } } }
//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------- using System.ServiceModel; using Microsoft.Samples.DocumentApprovalProcess.ApprovalMessageContractLibrary; namespace Microsoft.Samples.DocumentApprovalProcess.ApprovalClient { [ServiceContract] interface IClientApproval { // Called by ApprovalManager seeking approval of a document [OperationContract(IsOneWay=true)] void RequestClientResponse(ApprovalRequest docApprovalRequest); // Called by ApprovalManager informing client that a approval request has been canceled [OperationContract(IsOneWay = true)] void CancelRequestClientResponse(ApprovalRequest docApprovalRequest); } class ApprovalRequestsService : IClientApproval { public void RequestClientResponse(ApprovalRequest docApprovalRequest) { ExternalToMainComm.NewApprovalRequest(docApprovalRequest); } public void CancelRequestClientResponse(ApprovalRequest docApprovalRequest) { ExternalToMainComm.CancelApprovalRequest(docApprovalRequest); } } }
//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------- using System; using System.Activities; using System.Activities.Statements; using System.ServiceModel; using System.ServiceModel.Activities; using System.ServiceModel.Dispatcher; using Microsoft.Samples.DocumentApprovalProcess.ApprovalMessageContractLibrary; namespace Microsoft.Samples.DocumentApprovalProcess.ApprovalClient { public sealed class ClientRequestApprovalWorkflow : Activity { public ClientRequestApprovalWorkflow() { Variable<CorrelationHandle> corr = new Variable<CorrelationHandle>(); Variable<ApprovalResponse> response = new Variable<ApprovalResponse>(); Variable<ApprovalRequest> cancelRequest = new Variable<ApprovalRequest> { Name = "CancelRequest" }; Variable<StartApprovalParams> startParams = new Variable<StartApprovalParams>(); Variable<CorrelationHandle> requestReplyHandle = new Variable<CorrelationHandle> { Name = "RequestReplyHandle" }; // For correlating between approval requests and responses MessageQuerySet approvalMQS = new MessageQuerySet { { "ApprovalProcessId", new XPathMessageQuery("local-name()=‘Id‘", new XPathMessageContext()) } }; this.Implementation = () => new Sequence { Variables = { corr, response, startParams, requestReplyHandle, cancelRequest }, Activities = { // Called by a local client proxy to trigger the creation of a new approval request new Receive { OperationName = "StartGetApproval", ServiceContractName = "IApprovalResults", Content = new ReceiveMessageContent(new OutArgument<StartApprovalParams>(startParams)), CanCreateInstance = true, }, // Ask the approval manager to start the approval process new Send { OperationName = "RequestApprovalOf", ServiceContractName = "IApprovalProcess", EndpointAddress = new InArgument<Uri>(env => startParams.Get(env).ServiceAddress), Endpoint = new Endpoint { Binding = new BasicHttpBinding(), }, Content = new SendMessageContent(new InArgument<ApprovalRequest>(env => startParams.Get(env).Request)), CorrelationInitializers = { new QueryCorrelationInitializer { CorrelationHandle = corr, MessageQuerySet = approvalMQS, }, } }, // Get a response from the approval manager or a request to cancel the approval // from the local client proxy (user presses the cancel request button on the ui) new Pick { Branches = { new PickBranch { Trigger = new Receive { OperationName = "ApprovalProcessResults", ServiceContractName = "IApprovalResults", CorrelatesWith = corr, CorrelatesOn = approvalMQS, Content = new ReceiveMessageContent(new OutArgument<ApprovalResponse>(response)), }, }, new PickBranch { Trigger = new Receive { OperationName = "CancelApprovalRequest", ServiceContractName = "IApprovalResults", CorrelatesWith = corr, CorrelatesOn = approvalMQS, Content = new ReceiveMessageContent(new OutArgument<ApprovalRequest>(cancelRequest)), }, // Send cancelation to the approval manager to pass on to clients approving document Action = new Sequence { Activities = { new Send { OperationName = "CancelApprovalRequest", ServiceContractName = "IApprovalProcess", EndpointAddress = new InArgument<Uri>(env => startParams.Get(env).ServiceAddress), Endpoint = new Endpoint { Binding = new BasicHttpBinding(), }, Content = new SendMessageContent(new InArgument<ApprovalRequest>(env => startParams.Get(env).Request)), }, new TerminateWorkflow { Reason = "Approval Request Canceled", } } } } } }, new InvokeMethod { TargetType = typeof(ExternalToMainComm), MethodName = "WriteStatusLine", Parameters = { new InArgument<String>("Got an approval response..."), }, }, // update ui with new response new InvokeMethod { TargetType = typeof(ExternalToMainComm), MethodName = "ApprovalRequestResponse", Parameters = { new InArgument<ApprovalResponse>(response), } }, } }; } } }
//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------- using System; using System.IO; using Microsoft.Samples.DocumentApprovalProcess.ApprovalMessageContractLibrary; namespace Microsoft.Samples.DocumentApprovalProcess.ApprovalClient { // This class is used to communicate with the Main WPF window from external sources // that don‘t have a reference to the UI (ex, for WCF services and WorkflowServiceHost) public static class ExternalToMainComm { public static Main Context { get; set; } // Called if ApprovalRequestsService got new approval request public static void NewApprovalRequest(ApprovalRequest request) { if (Context != null) Context.AddApprovalItem(request); } // Called if ApprovalRequestsService was told to cancel an existing request public static void CancelApprovalRequest(ApprovalRequest request) { if (Context != null) Context.RemoveApprovalItem(request); } // Called if the ApprovalRequestsService gets a response to a approval request generated locally public static void ApprovalRequestResponse(ApprovalResponse response) { if (Context != null) Context.ProcessResponse(response); } // Returns a writer that writes to the WPF status window -- this is used for client side tracking public static TextWriter GetStatusWriter() { if (Context != null) return new WindowTextWriter(Context.GetStatusTextBox()); else return null; } // Simpler but less flexable way to write to the WPF status window when compared // to getting a writer using GetStatusWriter() -- this is used to output debug messages public static void WriteStatusLine(String status) { if (Context != null) { GetStatusWriter().WriteLine(status); } } } }
标签:
原文地址:http://www.cnblogs.com/linhongquan/p/5496859.html