/// <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)); }
/// <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)); }