protected override object InvokeCore(object instance, object[] inputs, out object[] outputs) { outputs = ServiceUtility.EmptyObjectArray; IEnumerable<ValidationResult> validationErrors; object result; try { InvokeDescription invokeDescription = new InvokeDescription(this.operation, inputs); result = ((DomainService)instance).Invoke(invokeDescription, out validationErrors); } catch (Exception ex) { if (ex.IsFatal()) { throw; } throw ServiceUtility.CreateFaultException(ex); } if (validationErrors != null && validationErrors.Any()) { throw ServiceUtility.CreateFaultException(validationErrors); } return result; }
/// <summary> /// Derived classes override this method to provide custom invocation behavior. /// </summary> /// <param name="instance">Instance to invoke the invoker against.</param> /// <param name="inputs">Input parameters post conversion.</param> /// <param name="outputs">Optional out parameters.</param> /// <returns>Result of invocation.</returns> protected override object InvokeCore(object instance, object[] inputs, out object[] outputs) { outputs = ServiceUtils.EmptyObjectArray; IEnumerable<ValidationResult> validationErrors; object result; try { InvokeDescription description = new InvokeDescription(this.operation, inputs); result = ((DomainService)instance).Invoke(description, out validationErrors); } catch (UnauthorizedAccessException ex) { throw new DomainDataServiceException((int)System.Net.HttpStatusCode.Unauthorized, ex.Message, ex); } catch (Exception ex) { if (ex.IsFatal()) { throw; } else { throw new DomainDataServiceException(Resource.DomainDataService_General_Error, ex); } } DomainDataServiceException.HandleValidationErrors(validationErrors); return result; }
/// <summary> /// Helper method performs a invoke operation against a given proxy instance. /// </summary> /// <param name="domainService">The type of <see cref="DomainService"/> to perform this query operation against.</param> /// <param name="context">The current context.</param> /// <param name="domainServiceInstances">The list of tracked <see cref="DomainService"/> instances that any newly created /// <see cref="DomainServices"/> will be added to.</param> /// <param name="name">The name of the operation to invoke.</param> /// <param name="parameters">The operation parameters.</param> /// <returns>The result of the invoke operation.</returns> /// <exception cref="ArgumentNullException">if <paramref name="context"/> is null.</exception> /// <exception cref="ArgumentNullException">if <paramref name="name"/> is null or an empty string.</exception> /// <exception cref="OperationException">if operation errors are thrown during execution of the invoke operation.</exception> public static object Invoke(Type domainService, DomainServiceContext context, IList<DomainService> domainServiceInstances, string name, object[] parameters) { context = new DomainServiceContext(context, DomainOperationType.Invoke); DomainService service = CreateDomainServiceInstance(domainService, context, domainServiceInstances); DomainServiceDescription serviceDescription = DomainServiceDescription.GetDescription(service.GetType()); DomainOperationEntry method = serviceDescription.GetInvokeOperation(name); IEnumerable<ValidationResult> validationErrors; InvokeDescription invokeDescription = new InvokeDescription(method, parameters); object result = service.Invoke(invokeDescription, out validationErrors); if (validationErrors != null && validationErrors.Any()) { IEnumerable<ValidationResultInfo> operationErrors = validationErrors.Select(ve => new ValidationResultInfo(ve.ErrorMessage, ve.MemberNames)); throw new OperationException(Resource.DomainServiceProxy_OperationError, operationErrors); } return result; }