/// <summary>
        /// Allows agent configuration by specifying a custom middleware
        /// </summary>
        /// <remarks>Requires corresponding call to AddAriesOpenApi in ConfigureServices</remarks>
        /// <param name="aApplicationBuilder">App.</param>
        public static void UseAriesOpenApi(this IApplicationBuilder aApplicationBuilder)
        {
            AriesOpenApiOptions ariesOpenApiOptions =
                aApplicationBuilder.ApplicationServices.GetRequiredService <AriesOpenApiOptions>();

            if (ariesOpenApiOptions.UseSwaggerUi)
            {
                aApplicationBuilder
                .UseSwagger
                (
                    aSwaggerOptions =>
                    aSwaggerOptions.RouteTemplate = $"{ariesOpenApiOptions.RoutePrefix}/{{documentname}}/swagger.json"
                );

                // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
                // specifying the Swagger JSON endpoint.
                aApplicationBuilder.UseSwaggerUI
                (
                    aSwaggerUIOptions =>
                {
                    aSwaggerUIOptions.SwaggerEndpoint(ariesOpenApiOptions.SwaggerEndPoint, ariesOpenApiOptions.SwaggerApiTitle);
                    aSwaggerUIOptions.RoutePrefix = ariesOpenApiOptions.RoutePrefix;
                }
                );
            }
            //aApplicationBuilder.UseRouting();
            //aApplicationBuilder.UseEndpoints(aEndpointRouteBuilder => aEndpointRouteBuilder.MapControllers());
        }
        private static void ConfigureSwagger
        (
            IServiceCollection aServiceCollection,
            AriesOpenApiOptions aAriesOpenApiOptions
        )
        {
            aServiceCollection.AddSwaggerGen
            (
                aSwaggerGenOptions =>
            {
                aSwaggerGenOptions
                .SwaggerDoc
                (
                    SwaggerVersion,
                    new OpenApiInfo {
                    Title = aAriesOpenApiOptions.SwaggerApiTitle, Version = SwaggerVersion
                }
                );

                aSwaggerGenOptions.EnableAnnotations();

                string xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
                string xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
                aSwaggerGenOptions.IncludeXmlComments(xmlPath);

                xmlFile = $"{typeof(BaseRequest).Assembly.GetName().Name}.xml";
                xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
                aSwaggerGenOptions.IncludeXmlComments(xmlPath);

                xmlFile = $"{typeof(BaseEndpoint<,>).Assembly.GetName().Name}.xml";
                xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
                aSwaggerGenOptions.IncludeXmlComments(xmlPath);

                aSwaggerGenOptions.AddFluentValidationRules();

                aSwaggerGenOptions
                .OrderActionsBy
                (
                    aApiDescription =>
                    $"{aApiDescription.GroupName}{aApiDescription.HttpMethod}" +
                    $"{aApiDescription.RelativePath.Contains("{")}{aApiDescription.RelativePath}"
                );
            }
            );
        }
        /// <summary>
        /// Register Aries Open Api services
        /// </summary>
        /// <param name="aMvcBuilder"></param>
        /// <param name="aConfigureAriesOpenApiOptionsAction"></param>
        public static IMvcBuilder AddAriesOpenApi
        (
            this IMvcBuilder aMvcBuilder,
            Action <AriesOpenApiOptions> aConfigureAriesOpenApiOptionsAction = null
        )
        {
            IServiceCollection serviceCollection = aMvcBuilder.Services;

            bool hasAlreadyBeenRun = serviceCollection.Any(aServiceDescriptor => aServiceDescriptor.ServiceType == typeof(AriesOpenApiOptions));

            if (hasAlreadyBeenRun)
            {
                return(aMvcBuilder);
            }

            var ariesOpenApiOptions = new AriesOpenApiOptions();

            aConfigureAriesOpenApiOptionsAction?.Invoke(ariesOpenApiOptions);

            aMvcBuilder
            .AddApplicationPart(typeof(AriesOpenApiOptions).Assembly);


            ConfigureFluentValidationServices(serviceCollection);
            serviceCollection.Configure <ApiBehaviorOptions>
            (
                aApiBehaviorOptions => aApiBehaviorOptions.SuppressInferBindingSourcesForParameters = true
            );

            serviceCollection.AddMediatR(typeof(BaseError).Assembly);

            ConfigureAriesOpenApiOptions(serviceCollection, ariesOpenApiOptions);

            if (ariesOpenApiOptions.UseSwaggerUi)
            {
                ConfigureSwagger(serviceCollection, ariesOpenApiOptions);
            }

            return(aMvcBuilder);
        }
 private static string ConfigureAriesOpenApiOptions(IServiceCollection aServiceCollection, AriesOpenApiOptions aAriesOpenApiOptions)
 {
     aAriesOpenApiOptions.SwaggerApiTitle = $"Aries Open API {SwaggerVersion}";
     aAriesOpenApiOptions.RoutePrefix     = $"{BaseRequest.BaseUri}swagger";
     aAriesOpenApiOptions.SwaggerEndPoint = $"/{aAriesOpenApiOptions.RoutePrefix}/{SwaggerVersion}/swagger.json";
     aServiceCollection.AddSingleton <AriesOpenApiOptions>(aAriesOpenApiOptions);
     return(SwaggerVersion);
 }