public String Invoke(String input) { Dictionary<String, String> parameters = new Dictionary<String, String>(StringComparer.OrdinalIgnoreCase); this.SetInvokeString(input); // Need to create a dummy root node String rootNode = "Invoke"; String xml = String.Format("<{0}>{1}</{0}>", rootNode, input); try { XElement elements = XElement.Parse(xml); foreach (XElement xe in elements.Elements()) { StringBuilder parameterValue = new StringBuilder(); foreach (XNode xn in xe.Nodes()) { parameterValue.Append(xn.ToString()); } parameters.Add(xe.Name.ToString(), parameterValue.ToString()); } } catch (Exception ex) { String error = ex.ToString(); Logging.Log(error, 1); return String.Format("<ERR>0</ERR><STATUSCODE>100</STATUSCODE><MSG>{0}</MSG>", error); } if (!parameters.ContainsKey("func")) return "<ERR>0</ERR><STATUSCODE>100</STATUSCODE><MSG>Parameter 'func' not specified</MSG>"; if (!invokeMethods.ContainsKey(parameters["func"])) return String.Format("<ERR>0</ERR><STATUSCODE>100</STATUSCODE><MSG>Function '{0}' not available</MSG>", parameters["func"]); String cReturnValue = ""; //String cTransactionName = ""; //if (_bShouldRollback) //{ // //cTransactionName = "_" + DateTime.Now.Ticks.ToString(); // database.BeginTransaction(cTransactionName); //} // TODO: This is just a temporary change. Ideally, need to wrap the entire Invoke in a single BEGIN TRANSACTION/ROLLBACK instead // of rolling back each processed SQL execution statement. if (parameters.ContainsKey("testonly")) database.rollback = true; cReturnValue = invokeMethods[parameters["func"]](parameters); //if (_bShouldRollback) //{ // database.RollbackTransaction(cTransactionName); //} return cReturnValue; } } }And we also have the following:
private delegate String InvokeMethod(Dictionary<String, String> parameters);
private Dictionary<String, InvokeMethod> GetInvokeMethods() { Dictionary<String, InvokeMethod> methodDictionary = new Dictionary<String, InvokeMethod>(StringComparer.OrdinalIgnoreCase) { // Base {"GetServerVersion", GetServerVersion}, //Data {"AppendRecs" , data.AppendRecs}, // JT 02/18/2013 Done {"DeleteAlreadyCreatedTransactionRecord", data.DeleteAlreadyCreatedTransactionRecord}, {"GetItemNextModified" , data.GetItemNextModified}, {"GetItemTable" , data.GetItemTable},So, we mapped each method to its class implementation. In my Sales class I want to see how exactly I was invoked.