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