public async Task Invoke(RefreshContext <TService> ctx) { DbSetInfo dbSetInfo = ctx.Request.GetDbSetInfo() ?? throw new InvalidOperationException($"Could not get the DbSet for {ctx.Request.dbSetName}"); IServiceOperationsHelper <TService> serviceHelper = ctx.ServiceContainer.GetServiceHelper(); RunTimeMetadata metadata = ctx.Service.GetMetadata(); RequestContext req = RefreshContext <TService> .CreateRequestContext(ctx.Service, ctx.Request.rowInfo); using (RequestCallContext callContext = new RequestCallContext(req)) { MethodInfoData methodData = metadata.GetOperationMethodInfo(ctx.Request.dbSetName, MethodType.Refresh); object instance = serviceHelper.GetMethodOwner(methodData); object invokeRes = methodData.MethodInfo.Invoke(instance, new object[] { ctx.Request }); object dbEntity = await serviceHelper.GetMethodResult(invokeRes); if (dbEntity != null) { serviceHelper.UpdateRowInfoFromEntity(dbEntity, ctx.Request.rowInfo); } else { throw new InvalidOperationException($"Refresh Operation for {ctx.Request.dbSetName} did not return a result"); } } await _next(ctx); }
public async Task Invoke(InvokeContext <TService> ctx) { IDataHelper <TService> dataHelper = ctx.ServiceContainer.GetDataHelper(); IServiceOperationsHelper <TService> serviceHelper = ctx.ServiceContainer.GetServiceHelper(); RunTimeMetadata metadata = ctx.Service.GetMetadata(); MethodDescription method = metadata.GetInvokeMethod(ctx.Request.methodName); List <object> methParams = new List <object>(); for (int i = 0; i < method.parameters.Count; ++i) { methParams.Add(ctx.Request.paramInfo.GetValue(method.parameters[i].name, method, dataHelper)); } RequestContext req = InvokeContext <TService> .CreateRequestContext(ctx.Service); using (RequestCallContext callContext = new RequestCallContext(req)) { MethodInfoData methodData = method.GetMethodData(); object instance = serviceHelper.GetMethodOwner(methodData); object invokeRes = methodData.MethodInfo.Invoke(instance, methParams.ToArray()); object methodResult = await serviceHelper.GetMethodResult(invokeRes); if (method.methodResult) { ctx.Response.result = methodResult; } } await _next(ctx); }
protected virtual void Dispose(bool isDisposing) { if (_serviceHelper is IDisposable && isDisposing) { (_serviceHelper as IDisposable).Dispose(); } this._serviceHelper = null; this._serviceContainer = null; }
public BaseDomainService(IServiceArgs args) { this.serializer = args.serializer; if (this.serializer == null) { throw new ArgumentException(ErrorStrings.ERR_NO_SERIALIZER); } this._User = args.principal; this._IsCodeGenEnabled = false; this._codeGenProviders = null; this._serviceContainer = this.CreateServiceContainer(); this._serviceHelper = this.CreateServiceHelper(); }
private async Task Delete(CRUDContext <TService> ctx, RunTimeMetadata metadata, ChangeSetRequest changeSet, RowInfo rowInfo) { TService service = ctx.Service; IServiceOperationsHelper <TService> serviceHelper = ctx.ServiceContainer.GetServiceHelper(); CheckRowInfo(rowInfo); using (RequestCallContext callContext = new RequestCallContext(CRUDContext <TService> .CreateRequestContext(service, changeSet, rowInfo))) { rowInfo.SetChangeState(new EntityChangeState()); await serviceHelper.DeleteEntity(metadata, rowInfo);; } }
private async Task Insert(CRUDContext <TService> ctx, RunTimeMetadata metadata, ChangeSetRequest changeSet, IChangeSetGraph graph, RowInfo rowInfo) { TService service = ctx.Service; IServiceOperationsHelper <TService> serviceHelper = ctx.ServiceContainer.GetServiceHelper(); CheckRowInfo(rowInfo); using (RequestCallContext callContext = new RequestCallContext(CRUDContext <TService> .CreateRequestContext(service, changeSet, rowInfo))) { rowInfo.SetChangeState(new EntityChangeState { ParentRows = graph.GetParents(rowInfo) }); await serviceHelper.InsertEntity(metadata, rowInfo); } }
public async Task Invoke(CRUDContext <TService> ctx) { IServiceOperationsHelper <TService> serviceHelper = ctx.ServiceContainer.GetServiceHelper(); RunTimeMetadata metadata = ctx.Service.GetMetadata(); ChangeSetRequest changeSet = ctx.Request; ChangeSetGraph graph = new ChangeSetGraph(ctx.Request, metadata); graph.Prepare(); ctx.Properties.Add(CRUDContext <TService> .CHANGE_GRAPH_KEY, graph); RowInfo currentRowInfo = null; try { foreach (RowInfo rowInfo in graph.InsertList) { currentRowInfo = rowInfo; await Insert(ctx, metadata, changeSet, graph, rowInfo); } foreach (RowInfo rowInfo in graph.UpdateList) { currentRowInfo = rowInfo; await Update(ctx, metadata, changeSet, rowInfo); } foreach (RowInfo rowInfo in graph.DeleteList) { currentRowInfo = rowInfo; await Delete(ctx, metadata, changeSet, rowInfo); } } catch (Exception ex) { if (currentRowInfo != null) { object dbEntity = currentRowInfo.GetChangeState()?.Entity; currentRowInfo.SetChangeState(new EntityChangeState { Entity = dbEntity, Error = ex }); } throw; } await _next(ctx); }
public async Task Invoke(QueryContext <TService> ctx) { DbSetInfo dbSetInfo = ctx.Request.GetDbSetInfo() ?? throw new InvalidOperationException($"Could not get the DbSet for {ctx.Request.dbSetName}"); IDataHelper <TService> dataHelper = ctx.ServiceContainer.GetDataHelper(); IServiceOperationsHelper <TService> serviceHelper = ctx.ServiceContainer.GetServiceHelper(); RunTimeMetadata metadata = ctx.Service.GetMetadata(); MethodDescription method = metadata.GetQueryMethod(ctx.Request.dbSetName, ctx.Request.queryName); LinkedList <object> methParams = new LinkedList <object>(); for (int i = 0; i < method.parameters.Count; ++i) { methParams.AddLast(ctx.Request.paramInfo.GetValue(method.parameters[i].name, method, dataHelper)); } RequestContext req = QueryContext <TService> .CreateRequestContext(ctx.Service, ctx.Request); using (RequestCallContext callContext = new RequestCallContext(req)) { MethodInfoData methodData = method.GetMethodData(); object instance = serviceHelper.GetMethodOwner(methodData); object invokeRes = methodData.MethodInfo.Invoke(instance, methParams.ToArray()); QueryResult queryResult = (QueryResult)await serviceHelper.GetMethodResult(invokeRes); IEnumerable <object> entities = queryResult.Result; int? totalCount = queryResult.TotalCount; RowGenerator rowGenerator = new RowGenerator(dbSetInfo, entities, dataHelper); IEnumerable <Row> rows = rowGenerator.CreateRows(); SubsetsGenerator subsetsGenerator = new SubsetsGenerator(metadata, dataHelper); SubsetList subResults = subsetsGenerator.CreateSubsets(queryResult.subResults); ctx.Response.names = dbSetInfo.GetNames(); ctx.Response.totalCount = totalCount; ctx.Response.rows = rows; ctx.Response.subsets = subResults; ctx.Response.extraInfo = queryResult.extraInfo; } await _next(ctx); }
private async Task <bool> ValidateRows(CRUDContext <TService> ctx, ChangeSetRequest changeSet, RunTimeMetadata metadata, IEnumerable <RowInfo> rows) { TService service = ctx.Service; IServiceOperationsHelper <TService> serviceHelper = ctx.ServiceContainer.GetServiceHelper(); foreach (RowInfo rowInfo in rows) { RequestContext req = CRUDContext <TService> .CreateRequestContext(service, changeSet, rowInfo); using (RequestCallContext callContext = new RequestCallContext(req)) { if (!await serviceHelper.ValidateEntity(metadata, req)) { rowInfo.invalid = rowInfo.GetChangeState().ValidationErrors; return(false); } } } return(true); }
public async Task Invoke(CRUDContext <TService> ctx) { IServiceOperationsHelper <TService> serviceHelper = ctx.ServiceContainer.GetServiceHelper(); IDataHelper <TService> dataHelper = ctx.ServiceContainer.GetDataHelper(); Metadata.RunTimeMetadata metadata = ctx.Service.GetMetadata(); ChangeSetRequest changeSet = ctx.Request; IChangeSetGraph graph = ctx.Properties.Get <IChangeSetGraph>(CRUDContext <TService> .CHANGE_GRAPH_KEY) ?? throw new InvalidOperationException("Could not get Graph changes from properties"); CRUDServiceMethods serviceMethods = ctx.Properties.Get <CRUDServiceMethods>(CRUDContext <TService> .CHANGE_METHODS_KEY) ?? throw new InvalidOperationException("Could not get CRUD Service methods from properties"); RequestContext req = CRUDContext <TService> .CreateRequestContext(ctx.Service, changeSet); using (RequestCallContext callContext = new RequestCallContext(req)) { await serviceMethods.ExecuteChangeSet(); await serviceHelper.AfterExecuteChangeSet(changeSet); await serviceMethods.AfterChangeSetExecuted(); foreach (RowInfo rowInfo in graph.AllList) { if (rowInfo.changeType != ChangeType.Deleted) { serviceHelper.UpdateRowInfoAfterUpdates(rowInfo); } } SubResultList subResults = new SubResultList(); await serviceHelper.AfterChangeSetCommited(changeSet, subResults); await serviceMethods.AfterChangeSetCommited(subResults); SubsetsGenerator subsetsGenerator = new SubsetsGenerator(metadata, dataHelper); ctx.Response.subsets = subsetsGenerator.CreateSubsets(subResults); } await _next(ctx); }