예제 #1
0
        /// <summary>
        /// Метод запуска операции на выполнение, <входная> точка операции
        /// ПЕРЕГРУЖЕННЫЙ, СТРОГО ТИПИЗИРОВАННЫЙ МЕТОД
        /// ВЫЗЫВАЕТСЯ ЯДРОМ АВТОМАТИЧЕСКИ
        /// </summary>
        /// <param name="request">Запрос на выполнение операции</param>
        /// <param name="context">Контекст выполнения операции</param>
        /// <returns>Результат выполнения</returns>
        public XDeleteObjectResponse Execute(DeleteObjectByExKeyRequest 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)
            {
                // Реакция операции зависит от управляющего флага в запросе:
                // если считается, что отсутствующий объект - это удаленный
                // объект, то возвращаем честный результат, но с нулем в кач-ве
                // кол-ва реально удаленных объектов; иначе (когда так не считаем)
                // генерируем исключение:
                if (request.TreatNotExistsObjectAsDeleted)
                {
                    return(new XDeleteObjectResponse(0));
                }
                else
                {
                    throw new ArgumentException("Объект, заданный значениями своих свойств, не найден!");
                }
            }

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

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

            return((XDeleteObjectResponse)context.ExecCommand(requestDeleteObject, true));
        }
예제 #2
0
        /// <summary>
        /// Метод выполнения операции, типизированная реализация
        /// </summary>
        ///	<param name="oRequest">Объект-запрос на выполнение операции</param>
        /// <param name="oContext">Представление контекста выполнения операции</param>
        /// <returns>
        /// Экземпляр объекта-результата выполнения операции
        /// </returns>
        public XResponse Execute(XDeleteObjectRequest oRequest, IXExecutionContext oContext)
        {
            // Проверка параметров запроса
            XRequest.ValidateRequiredArgument(oRequest.TypeName, "XDeleteObjectRequest.TypeName");
            XRequest.ValidateRequiredArgument(oRequest.ObjectID, "XDeleteObjectRequest.ObjectID");

            DomainObjectData objData = DomainObjectData.CreateStubLoaded(oContext.Connection, oRequest.TypeName, oRequest.ObjectID);
            XObjectRights    rights  = XSecurityManager.Instance.GetObjectRights(objData);

            if (!rights.AllowDelete)
            {
                throw new XSecurityException(String.Format(
                                                 "Выполнение операции невозможно: нет прав на удаление объекта \"{0}\" ({1}[oid='{2}'])",
                                                 objData.TypeInfo.Description,
                                                 oRequest.TypeName,
                                                 oRequest.ObjectID
                                                 ));
            }

            // Вызываем метод подсистемы Storage (уровень Level-2); экземпляр
            // Storage представлен в рамках контекста выполнения опеарции
            return(new XDeleteObjectResponse(XStorageGateway.Delete(oContext, oRequest.TypeName, oRequest.ObjectID)));
        }