public HomeController(IOperationTransient transient, IOperationScoped scoped, IOperationSingleton singleton, IOperationInstance instance) { this._transient = transient; this._scoped = scoped; this._singleton = singleton; this._instance = instance; }
public OperationService(IOperationTransient transientOperation, IOperationScoped scopedOperation, IOperationSingleton singletonOperation, IOperationInstance instanceOperation) { TransientOperation = transientOperation; ScopedOperation = scopedOperation; SingletonOperation = singletonOperation; InstanceOperation = instanceOperation; }
public OperationsController(OperationService operationService, IOperationTransient transientOperation, IOperationScoped scopedOperation, IOperationSingleton singletonOperation, IOperationInstance instanceOperation) { _operationService = operationService; _transientOperation = transientOperation; _scopedOperation = scopedOperation; _singletonOperation = singletonOperation; _instanceOperation = instanceOperation; }
/// <inheritdoc/> public async Task <TResponse> InvokeAsync(string path, string method, TRequest request, OpenApiOperationPathTemplate operationPathTemplate, IOpenApiContext context) { string operationId = operationPathTemplate.Operation.OperationId; if (!this.operationLocator.TryGetOperation(operationId, out OpenApiServiceOperation openApiServiceOperation)) { throw new OpenApiServiceMismatchException( $"The service's formal definition includes an operation '{operationPathTemplate.Operation.GetOperationId()}', but the service class does not provide an implementation"); } string operationName = openApiServiceOperation.GetName(); this.logger.LogInformation( "Executing operation [{openApiServiceOperation}] for [{path}] [{method}]", operationName, path, method); var instrumentationDetail = new AdditionalInstrumentationDetail { Properties = { { "Menes.OperationId", operationId } } }; using IOperationInstance instrumentationOperation = this.operationsInstrumentation.StartOperation( operationName, instrumentationDetail); try { IDictionary <string, object> namedParameters = await this.BuildRequestParametersAsync(request, operationPathTemplate).ConfigureAwait(false); // Try to find the tenantID in the parameters, but before we check the access policies. if (namedParameters.TryGetValue("tenantId", out object tenantIdObject) && tenantIdObject is string tenantId) { context.CurrentTenantId = tenantId; } await this.CheckAccessPoliciesAsync(context, path, method, operationId).ConfigureAwait(false); object result = openApiServiceOperation.Execute(context, namedParameters); if (this.logger.IsEnabled(LogLevel.Debug)) { this.logger.LogDebug( "Invoked operation [{openApiServiceOperation}] with parameters [{@namedParameters}] for request [{path}] [{method}], continuing to build result", openApiServiceOperation.GetName(), namedParameters.Keys, path, method); } if (result is Task task) { if (this.logger.IsEnabled(LogLevel.Debug)) { this.logger.LogDebug( "Awaiting task {task} from invoking operation [{openApiServiceOperation}] for [{request}]", task.Id, openApiServiceOperation.GetName(), path, method); } result = await task.CastWithConversion <object>().ConfigureAwait(false); if (this.logger.IsEnabled(LogLevel.Debug)) { this.logger.LogDebug( "Result from awaited task [{task}] from invoking operation [{openApiServiceOperation}] for request [{path}] [{method}]", task.Id, openApiServiceOperation.GetName(), path, method); } } if (this.logger.IsEnabled(LogLevel.Debug)) { this.logger.LogDebug( "Building result for request [{path}] [{method}] from invoking operation [{openApiServiceOperation}]", path, method, openApiServiceOperation.GetName()); } await this.auditContext.AuditResultAsync(context, result, operationPathTemplate.Operation).ConfigureAwait(false); return(this.BuildResult(result, operationPathTemplate.Operation)); } catch (OpenApiServiceMismatchException ce) { // Something somewhere is misconfigured, so all bets are now off. this.LogConfigurationError(ce); await this.auditContext.AuditFailureAsync(context, 500, operationPathTemplate.Operation).ConfigureAwait(false); return(this.BuildErrorResult(500)); } catch (Exception ex) { this.exceptionsInstrumentation.ReportException(ex, instrumentationDetail); try { this.logger.LogError( ex, "Exception occurred invoking operation [{openApiServiceOperation}] for [{path}] [{method}]", openApiServiceOperation.GetName(), path, method); OpenApiResult result = this.GetResultForException(ex, operationPathTemplate.Operation); await this.auditContext.AuditResultAsync(context, result, operationPathTemplate.Operation).ConfigureAwait(false); return(this.BuildResult(result, operationPathTemplate.Operation)); } catch (OpenApiServiceMismatchException ce) { this.LogConfigurationError(ce); await this.auditContext.AuditFailureAsync(context, 500, operationPathTemplate.Operation).ConfigureAwait(false); return(this.BuildErrorResult(500)); } } }