public HomeController(IOperationTransient transient, IOperationScoped scoped, IOperationSingleton singleton, IOperationInstance instance)
 {
     this._transient = transient;
     this._scoped    = scoped;
     this._singleton = singleton;
     this._instance  = instance;
 }
예제 #2
0
 public OperationService(IOperationTransient transientOperation,
     IOperationScoped scopedOperation,
     IOperationSingleton singletonOperation,
     IOperationInstance instanceOperation)
 {
     TransientOperation = transientOperation;
     ScopedOperation = scopedOperation;
     SingletonOperation = singletonOperation;
     InstanceOperation = instanceOperation;
 }
예제 #3
0
 public OperationService(IOperationTransient transientOperation,
                         IOperationScoped scopedOperation,
                         IOperationSingleton singletonOperation,
                         IOperationInstance instanceOperation)
 {
     TransientOperation = transientOperation;
     ScopedOperation    = scopedOperation;
     SingletonOperation = singletonOperation;
     InstanceOperation  = instanceOperation;
 }
예제 #4
0
 public OperationsController(OperationService operationService,
     IOperationTransient transientOperation,
     IOperationScoped scopedOperation,
     IOperationSingleton singletonOperation,
     IOperationInstance instanceOperation)
 {
     _operationService = operationService;
     _transientOperation = transientOperation;
     _scopedOperation = scopedOperation;
     _singletonOperation = singletonOperation;
     _instanceOperation = instanceOperation;
 }
예제 #5
0
 public OperationsController(OperationService operationService,
                             IOperationTransient transientOperation,
                             IOperationScoped scopedOperation,
                             IOperationSingleton singletonOperation,
                             IOperationInstance instanceOperation)
 {
     _operationService   = operationService;
     _transientOperation = transientOperation;
     _scopedOperation    = scopedOperation;
     _singletonOperation = singletonOperation;
     _instanceOperation  = instanceOperation;
 }
예제 #6
0
        /// <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));
                }
            }
        }