Пример #1
0
        /// <summary>
        /// Метод запуска операции на выполнение, <входная> точка операции
        /// ПЕРЕГРУЖЕННЫЙ, СТРОГО ТИПИЗИРОВАННЫЙ МЕТОД
        /// ВЫЗЫВАЕТСЯ ЯДРОМ АВТОМАТИЧЕСКИ
        /// </summary>
        /// <param name="request">Запрос на выполнение операции</param>
        /// <param name="context">Контекст выполнения операции</param>
        /// <returns>Результат выполнения</returns>
        public XGetObjectResponse Execute(GetObjectByExKeyRequest request, IXExecutionContext context)
        {
            // ПЕРВОЕ: получим идентификатор объекта: воспользуемся логикой,
            // реализованной в базовом классе:
            Guid uidResultObjectID = Guid.Empty;

            // Если в запросе задано наименование источника данных, то для получения
            // идентификатора объекта используем именно его:
            if (null != request.DataSourceName && 0 != request.DataSourceName.Length)
            {
                uidResultObjectID = processDataSource(
                    request.DataSourceName,
                    request.Params,
                    context.Connection);
            }
            else
            {
                // Иначе (наименование источника данных не задано) формируем явный
                // запрос на получение ObjectID
                uidResultObjectID = processExplicitObjectIdRequest(
                    request.TypeName,
                    request.Params,
                    context.Connection);
            }

            // Если в итоге идентификатор объекта НЕ получили - генерируем
            // исключение, т.к. в этом случае невозможно загрузить данные объекта
            if (Guid.Empty == uidResultObjectID)
            {
                throw new ArgumentException("Объект, заданный значениями своих свойств, не найден!");
            }


            // ВТОРОЕ: вызываем стандартную операцию загрузки данных
            // ВНИМАНИЕ - при вызове будет так же вызываться guard-объект, назначенный
            // для операции GetObject!
            XGetObjectRequest requestGetObject = new XGetObjectRequest(request.TypeName, uidResultObjectID);

            // скопируем служебные атрибуты из исходного запроса
            requestGetObject.SessionID = request.SessionID;
            requestGetObject.Headers.Add(request.Headers);

            return((XGetObjectResponse)context.ExecCommand(requestGetObject, true));
        }
Пример #2
0
        /// <summary>
        /// Выполнение команды - типизированный вариант
        /// </summary>
        /// <param name="request">Запрос команды, должен иметь тип XGetPropertyRequest</param>
        /// <param name="context">Контекст выполнения команды</param>
        public XGetObjectResponse Execute(XGetObjectRequest request, IXExecutionContext context)
        {
            DomainObjectDataSet dataSet = new DomainObjectDataSet(context.Connection.MetadataManager.XModel);
            DomainObjectData    xobj;

            if (request.ObjectID != Guid.Empty)
            {
                xobj = dataSet.Load(context.Connection, request.TypeName, request.ObjectID);
                // Если заданы цепочки прогружаемых свойств, загрузим и эти данные:
                if (request.PreloadProperties != null)
                {
                    // ...По каждому списку прогружаемых свойств
                    foreach (string sPropList in request.PreloadProperties)
                    {
                        // Проверяем, что в массиве не передали null и пустые строки
                        if (null == sPropList)
                        {
                            throw new ArgumentNullException("PreloadProperties");
                        }
                        if (String.Empty == sPropList)
                        {
                            throw new ArgumentException(ERR_EMPTY_PRELOAD_PATH, "PreloadProperties");
                        }

                        dataSet.PreloadProperty(context.Connection, xobj, sPropList);
                    }
                }
            }
            else
            {
                xobj = dataSet.CreateNew(request.TypeName, false);
            }
            // сериализуем датасет с загруженными объектами в формат для Web-клиента
            DomainObjectDataXmlFormatter formatter = new DomainObjectDataXmlFormatter(context.Connection.MetadataManager);
            XmlElement xmlObject = formatter.SerializeObject(xobj, request.PreloadProperties);

            if (request.ObjectID != Guid.Empty)
            {
                // ..обработаем объект и все вложенные объекты в прогруженных свойства, расставим атрибуты ограничения доступа
                XmlObjectRightsProcessor.ProcessObject(xobj, xmlObject);
            }
            return(new XGetObjectResponse(xmlObject));
        }