深刻贯彻落实Core项目入口的各种配置

Program.cs(其实里面服务注入和中间件的配置可以单独拿到Startup.cs中)

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace Test.Core
{
    class Program
    {
        static Dictionary<string, string> memorySource = new Dictionary<string, string>
        {
            ["Format:DateTime:LongDatePattern"] = "dddd, MMMM d, yyyy",
            ["Format:DateTime:LongTimePattern"] = "h:mm:ss tt",
            ["Format:DateTime:ShortDatePattern"] = "M/d/yyyy",
            ["Format:DateTime:ShortTimePattern"] = "h:mm tt",

            ["Format:CurrencyDecimal:Digits"] = "2",
            ["Format:CurrencyDecimal:Symbol"] = "$",
        };

        //static IConfigurationRoot configuration = new ConfigurationBuilder().AddJsonFile("haha.json", true, true).Build();
        static IConfigurationRoot configuration = new ConfigurationBuilder().AddInMemoryCollection(memorySource).Build();

        public static void Main()
        {
            Console.OutputEncoding = Encoding.UTF8;  //解决控制台乱码问题

            //相对于网站应用来说,控制台应用大可不必调用CreateDefaultBuilder方法来让框架给你做一些提前量的工作
            //提前量的工作包括但不限于:实例化Kestrel服务作为网站的服务用于接收和响应请求,监控端口;设置网站的文件路径;
            //载入某些Configuration(从json,环境变量,内存等等) 等,详情见此方法的api说明

            //对于控制台应用来说,可以很干净地按需做一些服务注册,路由配置等等工作
            new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseConfiguration(configuration)  //单独实例化build出来的configuration通过UseConfiguration方法加入到全局的Configuration中
                .ConfigureAppConfiguration(builder => builder
                                                      .AddEnvironmentVariables()
                                                      .AddJsonFile("haha.json", true, true))
                .ConfigureAppConfiguration((context, builder) => builder
                                                                 //.SetBasePath(Directory.GetCurrentDirectory())
                                                                 .AddEnvironmentVariables()
                                                                 .AddJsonFile("haha.json", false, true))  //搞懂optional的含义,false表示json文件必需
                //.ConfigureAppConfiguration(ConfigureApp)  //此注释两行跟上述两行功能一致
                //.ConfigureAppConfiguration(ConfigureAppConfiguration)
                .ConfigureLogging(builder => builder
                                             .AddConfiguration(configuration))
                .ConfigureLogging((context, builder) => builder
                                                        .AddConfiguration(configuration)
                                                        .AddConfiguration(context.Configuration))  //注意这边Configuration的取法
                //.ConfigureLogging(ConfigureLog)  //此注释两行跟上述两行功能一致
                //.ConfigureLogging(ConfigureLogging)
                //.ConfigureServices(scs => scs.AddOptions())
                //.ConfigureServices((context, scs) => scs.AddOptions().Configure<JsonConfig>(context.Configuration.GetSection("Logging")))  //注意这边Configuration的取法
                //.ConfigureServices(ConfigureService)  //此注释两行跟上述两行功能一致
                .ConfigureServices(ConfigureServiceWithConfig)
                //.Configure(builder => builder.Run(async context => await context.Response.WriteAsync($"测试专用{configuration["Format:DateTime:LongDatePattern"]}")))
                .Configure(Configure)
                .Build()
                .Run();

        }

        #region 应用配置信息项设定
        private static void ConfigureApp(IConfigurationBuilder builder)
        {
            builder
                .AddEnvironmentVariables()
                .AddJsonFile("haha.json", true, true);
        }

        private static void ConfigureAppConfiguration(WebHostBuilderContext context, IConfigurationBuilder builder)
        {
            builder
                .AddEnvironmentVariables()
                .AddJsonFile("haha.json", true, true);
        }
        #endregion

        #region 应用日志配置项设定
        private static void ConfigureLog(ILoggingBuilder builder)
        {
            builder.AddConfiguration(configuration);
        }

        private static void ConfigureLogging(WebHostBuilderContext context, ILoggingBuilder builder)
        {
            builder.AddConfiguration(configuration)
                   .AddConfiguration(context.Configuration);  //注意这边应用配置的取法
        }
        #endregion

        #region 应用服务注入配置 -> 当需要注册的服务很多的时候,框架便设计成可以单独开辟一个Startup.cs文件,将此部分代码放进去
        private static void ConfigureService(IServiceCollection services)
        {
            services.AddOptions();
        }

        private static void ConfigureServiceWithConfig(WebHostBuilderContext context, IServiceCollection services)
        {
            services.AddOptions()
                    .Configure<JsonConfig>(context.Configuration.GetSection("Logging"));
        }
        #endregion

        #region 应用中间件配置-> 当需要注册的中间件很多的时候,框架便设计成可以单独开辟一个Startup.cs文件,将此部分代码放进去
        private static void Configure(IApplicationBuilder builder)
        {
            builder.Run(async context =>
                {
                    context.Response.Headers["Content-Type"] = "text/html; charset=utf-8";  //解决页面乱码问题
                    await context.Response.WriteAsync($"测试专用{ (context.RequestServices.GetRequiredService<IOptions<JsonConfig>>().Value.IncludeScopes == true ? "kong" : "true") }");
                });
        }
        #endregion
    }
}

其他文件

Json文件

{
  "Logging": {
    "IncludeScopes": true,
    "LogLevel": {
      "Default": "Information"
    }
  }
}

Json对应类

{
  "Logging": {
    "IncludeScopes": true,
    "LogLevel": {
      "Default": "Information"
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值