public WcfResponse Create(CreateRequest request) { Csla.Server.DataPortal portal = new Csla.Server.DataPortal(); object result; try { result = portal.Create(request.ObjectType, request.Criteria, request.Context, true).Result; } catch (Exception ex) { result = ex; } return new WcfResponse(result); }
/// <summary> /// Called by <see cref="DataPortal" /> to create a /// new business object. /// </summary> /// <param name="objectType">Type of business object to create.</param> /// <param name="criteria">Criteria object describing business object.</param> /// <param name="context"> /// <see cref="Server.DataPortalContext" /> object passed to the server. /// </param> /// <param name="isSync">True if the client-side proxy should synchronously invoke the server.</param> public async Task<DataPortalResult> Create(Type objectType, object criteria, DataPortalContext context, bool isSync) { #if !(ANDROID || IOS) && !NETFX_CORE ChannelFactory<IWcfPortal> cf = GetChannelFactory(); var proxy = GetProxy(cf); WcfResponse response = null; #if NET40 try { var request = new CreateRequest(objectType, criteria, context); if (isSync) { response = proxy.Create(request); } else { var worker = new Csla.Threading.BackgroundWorker(); var tcs = new TaskCompletionSource<WcfResponse>(); worker.RunWorkerCompleted += (o, e) => { tcs.SetResult((WcfResponse)e.Result); }; worker.DoWork += (o, e) => { e.Result = proxy.Create(request); }; worker.RunWorkerAsync(); response = await tcs.Task; } if (cf != null) cf.Close(); object result = response.Result; if (result is Exception) throw (Exception)result; return (DataPortalResult)result; } catch { cf.Abort(); throw; } #else try { var request = new CreateRequest(objectType, criteria, context); if (isSync) response = proxy.Create(request); else response = await proxy.CreateAsync(request); if (cf != null) cf.Close(); } catch { cf.Abort(); throw; } object result = response.Result; if (result is Exception) throw (Exception)result; return (DataPortalResult)result; #endif #else var request = GetBaseCriteriaRequest(); request.TypeName = objectType.AssemblyQualifiedName; if (!(criteria is IMobileObject)) { criteria = new PrimitiveCriteria(criteria); } request.CriteriaData = MobileFormatter.Serialize(criteria); request = ConvertRequest(request); var proxy = GetProxy(); DataPortalResult result = null; #if !NETFX_CORE && !(IOS || ANDROID) var tcs = new TaskCompletionSource<DataPortalResult>(); proxy.CreateCompleted += (s, e) => { try { Csla.WcfPortal.WcfResponse response = null; if (e.Error == null) response = ConvertResponse(e.Result); ContextDictionary globalContext = null; if (response != null) globalContext = (ContextDictionary)MobileFormatter.Deserialize(response.GlobalContext); if (e.Error == null && response != null && response.ErrorData == null) { var obj = MobileFormatter.Deserialize(response.ObjectData); result = new DataPortalResult(obj, null, globalContext); } else if (response != null && response.ErrorData != null) { var ex = new DataPortalException(response.ErrorData); result = new DataPortalResult(null, ex, globalContext); } else { result = new DataPortalResult(null, e.Error, globalContext); } } catch (Exception ex) { result = new DataPortalResult(null, ex, null); } finally { tcs.SetResult(result); } }; proxy.CreateAsync(request); var finalresult = await tcs.Task; if (finalresult.Error != null) throw finalresult.Error; return finalresult; #else try { var response = await proxy.CreateAsync(request); response = ConvertResponse(response); if (response == null) throw new DataPortalException("null response", null); var globalContext = (ContextDictionary)MobileFormatter.Deserialize(response.GlobalContext); if (response.ErrorData == null) { var obj = MobileFormatter.Deserialize(response.ObjectData); result = new DataPortalResult(obj, null, globalContext); } else { var ex = new DataPortalException(response.ErrorData); result = new DataPortalResult(null, ex, globalContext); } } catch (Exception ex) { result = new DataPortalResult(null, ex, null); } if (result.Error != null) throw result.Error; return result; #endif #endif }