private string GetEntityDescription(IManagerForObject objectManager, string entity) { var type = objectManager.GetTypeByName(entity); return(type == null ? entity : string.Format("{0} ({1})", type.GetDisplayName(), entity)); }
public Telegram ProcessTelegram(Telegram telegram) { Log.DebugFormat("Start processing telegram {0}", telegram.TransactionNumber); var startProcessingTime = DateTime.Now; var userSignature = telegram.UserInfo; var sessionId = telegram.FromId.ClientSessionId; var uowId = telegram.UnitOfWork; var timeOut = telegram.TimeOut; // если Guid.Empty, то мы имеем дело с короткой сессией (временем жизни управляем здесь же) bool disposeUow = uowId.Equals(Guid.Empty); // начинаем готовить ответную телеграмму var answer = new RepoAnswerTelegramWrapper(telegram);// new Telegram { Content = new Node { Name = "ANS", Value = "RepoAnswer" } }; //TODO: ПЕРЕПИСАТЬ ВСЕ с telegram НА RepoQueryWrapper // объявлем UnitOfWork (по сути - это сессия подключения, которая необходима нам для передачи подписи пользователя в БД + возможность организовать транзакцию) IUnitOfWork uow = null; try { if (telegram.Content.Nodes.Count == 0) { Log.WarnFormat("Telegramm is without content. Ending processing"); return(null); } var uowContext = new UnitOfWorkContext { UserSignature = userSignature, Id = uowId, SessionId = (int?)sessionId, TimeOut = timeOut }; uow = _uowFactory.Create(uowContext); if (disposeUow) { Log.DebugFormat("Open short UnitOfWork session"); } else { Log.DebugFormat("Open long UnitOfWork session (id = {0})", uowId); } // выставляем TimeOut - может быть изменен в процессе работы в транзакции if (timeOut.HasValue) { uow.TimeOut = timeOut; } var requestedEntity = telegram.Content.Nodes[0].Name; var actionName = telegram.Content.Nodes[0].Value; var parameters = telegram.Content.Nodes[0].Nodes; // если пришла телеграмма транзакции if (requestedEntity.EqIgnoreCase(typeof(IUnitOfWork).Name)) { var uowMethodInfo = GetMethod(uow.GetType(), actionName, parameters); if (uowMethodInfo == null) { throw new DeveloperException("Can't find method", new MissingMethodException(uow.GetType().Name, actionName)); } // заполеяем коллекцию входных параметров метода var uowMethodParams = uowMethodInfo.GetParameters(); var uowArgs = new object[uowMethodParams.Length]; for (var i = 0; i < uowMethodParams.Length; i++) { uowArgs[i] = GetParameterValue(uowMethodParams[i], parameters); } Log.DebugFormat("Invoke method {0}.{1}", uow.GetType().Name, uowMethodInfo.Name); uowMethodInfo.Invoke(uow, uowArgs); if (uowMethodInfo.Name.Equals("Dispose")) { Log.DebugFormat("Dispose long UnitOfWork session (id = {0})", uowId); } // Упаковываем секцию statictics // TODO: уйти от этого answer.AddStatisticNode("0"); return(null); } var mgrType = _managerForObject.GetManagerByTypeName(requestedEntity); if (mgrType == null) { throw new DeveloperException("Can't find manager for " + requestedEntity); } var objectType = _managerForObject.GetTypeByName(requestedEntity); if (objectType == null) { throw new DeveloperException("Can't find type for object " + requestedEntity); } object result; MethodInfo methodInfo; ParameterInfo[] methodParams; object[] args; double lastQueryExecutionTime; var mgr = IoC.Instance.Resolve(mgrType, null) as IBaseManager; if (mgr == null) { throw new DeveloperException("Can't resolve IBaseManager by {0}", mgrType); } // включаем данный manager в объявленную сессию работы. при этом временем жизни сессии управляем извне mgr.SetUnitOfWork(uow); // определяем, какой метод нужно выбрать methodInfo = GetMethod(mgrType, actionName, parameters); if (methodInfo == null) { throw new DeveloperException("Can't find method", new MissingMethodException(mgrType.Name, actionName)); } // заполняем коллекцию входных параметров метода methodParams = methodInfo.GetParameters(); args = new object[methodParams.Length]; for (var i = 0; i < methodParams.Length; i++) { args[i] = GetParameterValue(methodParams[i], parameters); } // вызываем метод Log.DebugFormat("Invoke method {0}.{1}", mgrType, methodInfo.Name); result = methodInfo.Invoke(mgr, args); lastQueryExecutionTime = mgr.LastQueryExecutionTime; // обрабатываем результаты работы answer.ProcessResults(requestedEntity, result, args, methodInfo, methodParams); //Упаковываем секцию statictics var statisticValue = lastQueryExecutionTime.ToString(CultureInfo.InvariantCulture); answer.AddStatisticNode(statisticValue); } // ловим все - канал нельзя останавливать catch (Exception ex) { try { var newEx = DALExceptionHandler.ProcessException(ex); answer.AddExceptionNode(newEx); } catch (Exception ex2) { Log.Error("Не удалось сформировать сообщение об ошибке: " + ExceptionHelper.GetErrorMessage(ex), ex2); } } finally { // закрываем короткую сессию if (uow != null && disposeUow) { Log.DebugFormat("Dispose short UnitOfWork session"); uow.Dispose(); } Log.DebugFormat("End processing telegram {0} in {1}", telegram.TransactionNumber, DateTime.Now - startProcessingTime); } return(answer.UnWrap()); }