public virtual void ConfigureServices(IServiceCollection services)
        {
            // Call Back
            BeforeConfigureServices?.Invoke(services);

            // Logger
            services.AddLogging(builder =>
            {
                builder.AddConsole();
                builder.SetMinimumLevel(LogLevel.Information);
            });

            // Mapper
            services.AddElectAutoMapper();

            // Http Context
            services.AddElectHttpContext();

            // Server Info
            services.AddElectServerInfo();

            // Blazor
            services.AddHeadElementHelper();

            services.AddRazorPages();
            services.AddServerSideBlazor();

            // Response Compress

            services.Configure <BrotliCompressionProviderOptions>(options =>
            {
                options.Level = CompressionLevel.Optimal;
            });

            services.Configure <GzipCompressionProviderOptions>(options =>
            {
                options.Level = CompressionLevel.Optimal;
            });

            services.AddResponseCompression(options =>
            {
                options.Providers.Add <BrotliCompressionProvider>();
                options.Providers.Add <GzipCompressionProvider>();
            });

            // DI
            services.AddElectDI();
            services.PrintServiceAddedToConsole();
            Console.ResetColor();

            // Call Back
            AfterConfigureServices?.Invoke(services);
        }
        public virtual void ConfigureServices(IServiceCollection services)
        {
            // Call Back
            BeforeConfigureServices?.Invoke(services);

            // Logger
            services.AddLogging(builder =>
            {
                builder.AddConsole();
                builder.SetMinimumLevel(LogLevel.Information);
            });

            // Mapper
            services.AddElectAutoMapper();

            // Http Context
            services.AddElectHttpContext();

            // Server Info
            services.AddElectServerInfo();

            // API Doc - Swagger
            var electSwaggerOptions = Elect.Web.Swagger.IServiceCollectionExtensions.GetOptions(Configuration);

            services.AddElectSwagger(electSwaggerOptions);

            // Health Check
            var electHealthCheckOptions = Elect.Web.HealthCheck.IServiceCollectionExtensions.GetOptions(Configuration);

            services.AddElectHealthCheck(electHealthCheckOptions);

            // Background Job - Hangfire
            var electHangfireOptions = Elect.Job.Hangfire.IServiceCollectionExtensions.GetOptions(Configuration);

            services.AddElectHangfire(electHangfireOptions);

            // Consul
            var electConsulOptions = Elect.Web.Consul.IServiceCollectionExtensions.GetOptions(Configuration);

            services.AddElectConsul(electConsulOptions);

            // Jaeger
            var electJaegerOptions = Elect.Jaeger.IServiceCollectionExtensions.GetOptions(Configuration);

            services.AddElectJaeger(electJaegerOptions);

            // MVC

            // MVC Core
            var mvcCoreBuilder = services.AddMvcCore(options => { options.EnableEndpointRouting = false; });

            // Callback
            BeforeConfigureMvc?.Invoke(mvcCoreBuilder);

            mvcCoreBuilder.AddDataAnnotations();

            mvcCoreBuilder.AddApiExplorer(); // API Doc - Swagger Needed

            mvcCoreBuilder.AddFormatterMappings();

            // Action Context Accessor
            services.AddSingleton <IActionContextAccessor, ActionContextAccessor>();

            // Model Binder
            services.AddDateTimeOffsetBinder();
            services.AddDateTimeBinder();
            services.AddTimeSpanBinder();

            // MVC Json Config
            mvcCoreBuilder.AddJsonOptions(options =>
            {
                options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
                options.JsonSerializerOptions.Converters.Add(new System.Text.Json.Serialization.JsonStringEnumConverter());
                options.JsonSerializerOptions.Converters.Add(new DateTimeOffsetJsonConverter());
                options.JsonSerializerOptions.Converters.Add(new DateTimeJsonConverter());
                options.JsonSerializerOptions.Converters.Add(new TimeSpanJsonConverter());
            });

            // Fluent Validation
            mvcCoreBuilder.AddFluentValidation(fvc =>
            {
                foreach (var type in RegisterValidators)
                {
                    fvc.RegisterValidatorsFromAssemblyContaining(type);
                }

                fvc.ImplicitlyValidateChildProperties = true;
            });

            // Callback
            AfterConfigureMvc?.Invoke(mvcCoreBuilder);

            // Cors
            services.AddElectCors();

            // Response Compress

            services.Configure <BrotliCompressionProviderOptions>(options =>
            {
                options.Level = CompressionLevel.Optimal;
            });

            services.Configure <GzipCompressionProviderOptions>(options =>
            {
                options.Level = CompressionLevel.Optimal;
            });

            services.AddResponseCompression(options =>
            {
                options.Providers.Add <BrotliCompressionProvider>();
                options.Providers.Add <GzipCompressionProvider>();
            });

            // DI
            services.AddElectDI();
            services.PrintServiceAddedToConsole();
            Console.ResetColor();

            // Call Back
            AfterConfigureServices?.Invoke(services);
        }