当前位置: 首页 > news >正文

ASP.NET 5 入门 (2) – 自定义配置

ASP.NET 5 入门 (2) – 自定义配置
原文: ASP.NET 5 入门 (2) – 自定义配置

 

ASP.NET 5 入门 (2) – 自定义配置

ASP.NET 5 理解和入门

建立和开发ASP.NET 5 项目

初步理解ASP.NET5的配置

正如我的第一篇文章ASP.NET 5 (vNext) 理解和概述 所说,ASP.NET 5的具有全新的配置机制,我们可以通过以下几点来进行理解:

  1. 支持多种跨平台的配置文件格式(如XML, Json, Ini和环境变量)
  2. 标准的配置文件如project.json不再包括任何自定义的配置信息.
  3. 自定义的配置完全由开发者另行建立和加载
  4. 自定义的配置信息可以通过依赖注入向全项目发放

建立自定义配置文件

首先我们在项目的根目录加入自定义的配置文件,config.json和config.ini (这里的文件名是可以任意定义的).

                       

Config.json的内容我们模拟如下

{
  "AppSettings": {
    "SiteTitle": "ASP.NET 5 Sample"
  },
  "Data": {
    "DefaultConnection": {
      "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=ASPNET5;Trusted_Connection=True;MultipleActiveResultSets=true"
    }
  }
}


Config.Ini的内容我们模拟如下:

DefaultPage=index.html

 

加载配置文件

之前也曾经提过,我们一般通过Startup类的构造函数来加载配置文件. Startup类的配置文件一般这样定义.

 

     public Startup(IHostingEnvironment env)
      {
      }


在最小模板,如果读取Json和ini文件,我们需要加入ConfigurationModel.Json的组件:

 

然后我们可以加入下面的代码来读取任意json文件,ini文件和系统环境变量

      public Startup(IHostingEnvironment env)
        {
            // 加载自定义的Json配置文件和INI配置文件
            var configuration = new Configuration()
                .AddJsonFile("config.json")
                .AddIniFile("config.ini");

            //加入系统的环境变量
            configuration.AddEnvironmentVariables();
        }

 

使用配置信息

加载完毕以后,利用上述代码中产生的configuration变量就能很方便的读取各种配置信息,这里提醒下,在以对象结构保存的配置信息中, Configuration类用”:”来实现对对象属性的导航,不太理解的可以看下面的代码:

 

           //尝试输出一些配置信息
            //对应config.json的Data.DefaultConnection.ConnectionString
            Console.WriteLine(configuration["Data:DefaultConnection:ConnectionString"]);
            //对应config.ini的DefaultPage
            Console.WriteLine(configuration["DefaultPage "]);
            //对应系统环境里面的Path
            Console.WriteLine(configuration["Path"]);

 

 

装载配置到环境容器

在Startup类中,我们可以很方便的通过一个成员变量来传递的configuration变量,比较常见的写法可以类似下面的代码

        private IConfiguration Configuration { get; set; }
        public Startup(IHostingEnvironment env)
        {
            // 加载自定义的Json配置文件和INI配置文件
            var configuration = new Configuration()
                .AddJsonFile("config.json")
                .AddIniFile("config.ini");
            //加入系统的环境变量
            configuration.AddEnvironmentVariables();
            //赋值给成员变量
            Configuration = configuration;
        }

 

但如果在整个项目中,就需要利用依赖注入技术把配置信息装载到环境容器中去,才能在整个项目中被灵活的调用.

在我前一篇博文关于启动类的描述中,曾经提及 Startup的ConfigureServices函数就是负责装载所有依赖注入服务的函数,所以我们需要在那里加入装载代码:

      public void ConfigureServices(IServiceCollection services)
        {
            //把Configuration对象放入服务容器
            services.AddInstance(typeof(IConfiguration), Configuration);
        }


注意这里的Configration是成员变量.

在其他区域使用配置

如何在项目的其他地方使用配置信息呢? 针对ASP.NET 5的依赖注入方式,我们一般有2种选择.

  1. 通过扩展任何在同一容器中的对象的构造函数的参数,来隐式的加载其他服务元素,这种方式略有晦涩,但非常简洁.(这种方式将在以后的MVC 6和EF 7介绍中再着重讨论)
  2. 通过当前上下文(在很多场合都可以通过我们的老朋友HttpContext获取)中的ApplicationServices属性,获取相对应的服务元素.

这里我们还没有加载MVC或者EF,我们就以Startup类的Configure函数来做一个示范:

第一种模式代码示例:

      public void Configure(IApplicationBuilder app,IConfiguration configuration)
        {
            //从当前容器中读出配置信息
            Console.WriteLine(configuration["DefaultPage"]);
            Console.WriteLine(configuration["AppSettings:SiteTitle"]);

        }


注意, IConfiguration configuration参数的隐式 转换是因为之前我们已经把Configuration加入Service容器. 如果没有之前的注册,这里的代码会报错.

第二种模式代码示例:

 

       public void Configure(IApplicationBuilder app)
        {
             var configuration = (IConfiguration)app.ApplicationServices.GetService(typeof(IConfiguration));
            //从当前容器中读出配置信息
            Console.WriteLine(configuration["DefaultPage"]);
            Console.WriteLine(configuration["AppSettings:SiteTitle"]);
        }


在后续的常见对象里,比如MVC的Controller,和EF的DbContext等,我们能够很便利的利用这2种方式获取整个项目的配置信息.

 好了,利用上面说到的方法,我们已经可以非常灵活在ASP.NET 5项目中,设置配置文件,加载配置文件,和使用配置信息,而且基于MVC服务,我们还可以对配置信息进行进一步的封装,

ASP.NET5的配置机制是不是很方便. 还有人想念web.config吗?

posted on 2017-12-16 09:24 NET未来之路 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/8045807.html

相关文章:

  • hadoop进阶
  • 程序员编程艺术第一~二十二章集锦与总结(教你如何编程)
  • C语言的内存分配
  • 级别
  • 函数指针和指针函数
  • Oracle集合
  • DataTable.Select方法
  • VMware Workstation与VM ware Esxi使用OVF文件交互
  • mariadb semi plugin遇到的坑
  • Android中BitmapFactory.Options详解
  • RAC之安装DB SOFT节点间时间一致导致tar错误
  • newFixedThreadPool固定线程使用
  • C#脚本实践(四): 反射与序列化
  • 第一次个人冲刺-个人总结03
  • 简化DBA查看日志的脚本
  • 【5+】跨webview多页面 触发事件(二)
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • CSS 专业技巧
  • echarts的各种常用效果展示
  • in typeof instanceof ===这些运算符有什么作用
  • JSONP原理
  • unity如何实现一个固定宽度的orthagraphic相机
  • vuex 笔记整理
  • webpack4 一点通
  • 从输入URL到页面加载发生了什么
  • 大型网站性能监测、分析与优化常见问题QA
  • 缓存与缓冲
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 简单数学运算程序(不定期更新)
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 前端性能优化--懒加载和预加载
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 深度学习中的信息论知识详解
  • 小程序测试方案初探
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 在Mac OS X上安装 Ruby运行环境
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (原)本想说脏话,奈何已放下
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)LINQ之路
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET/C# 使用反射注册事件
  • [ 第一章] JavaScript 简史
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [BUG] Authentication Error
  • [BUUCTF 2018]Online Tool