예제 #1
0
        private string GetEntityDescription(IManagerForObject objectManager, string entity)
        {
            var type = objectManager.GetTypeByName(entity);

            return(type == null ? entity : string.Format("{0} ({1})", type.GetDisplayName(), entity));
        }
예제 #2
0
        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());
        }