/// <summary>Registers swagger infrastructure.</summary>
        /// <param name="builder">Web api builder instance.</param>
        /// <param name="options">Options delegate for configuring swagger.</param>
        /// <returns>Service Collection instance.</returns>
        public static IWebApiBuilder AddSwaggerInfrastructure(this IWebApiBuilder builder, Action <SwaggerConfigurationOptions> options)
        {
            builder.Services.ConfigureOptions <DefaultSwaggerConfigureSetup>();
            builder.Services.AddOptions <SwaggerConfigurationOptions>()
            .Configure(options)
            .Validate(x => !string.IsNullOrEmpty(x.ApplicationName), "Application name is required");

            var serviceProvider             = builder.Services.BuildServiceProvider();
            var swaggerConfigurationOptions = serviceProvider.GetRequiredService <IOptions <SwaggerConfigurationOptions> >();

            builder.Services.AddSwaggerGen(c =>
            {
                // resolve the IApiVersionDescriptionProvider service
                // note: that we have to build a temporary service provider here because one has not been created yet
                var provider = builder.Services.BuildServiceProvider().GetRequiredService <IApiVersionDescriptionProvider>();

                // add a swagger document for each discovered API version
                // note: you might choose to skip or document deprecated API versions differently
                foreach (var description in provider.ApiVersionDescriptions)
                {
                    c.SwaggerDoc(description.GroupName, CreateInfoForApiVersion(description, swaggerConfigurationOptions.Value));
                }

                // Locate the XML file being generated by ASP.NET...
                var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(w => w.GetName().Name.StartsWith("RFERL"));
                foreach (var assembly in assemblies)
                {
                    var xmlFile = $"{assembly.GetName().Name}.XML";
                    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
                    if (File.Exists(xmlPath))
                    {
                        c.IncludeXmlComments(xmlPath);
                    }
                }

                c.SchemaFilter <SwaggerExcludeSchemaFilter>();
                c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
                c.DescribeAllEnumsAsStrings();
                c.DescribeStringEnumsInCamelCase();
                c.AddFluentValidationRules();

                swaggerConfigurationOptions.Value.SetCustomSwaggerOptions?.Invoke(c);
            });

            return(builder);
        }
 /// <summary>Registers swagger infrastructure.</summary>
 /// <param name="builder">Web api builder instance.</param>
 /// <returns>Service Collection instance.</returns>
 public static IWebApiBuilder AddSwaggerInfrastructure(this IWebApiBuilder builder)
 {
     builder.AddSwaggerInfrastructure(opt => { });
     return(builder);
 }