问题引出

ASP.NET Core 默认将 Web.config移除了,将配置文件统一放在了 xxx.json 格式的文件中。

有Web.config时,我们需要读到配置文件时,一般是这样的:

var value1= ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

这个ConfigurationManager是在System.Configuration 命名空间下的。

很不幸,默认情况下这个方法也不能用了。

如果在Controller需要读取配置文件,在Startup.cs文件中注册相关服务,可以类似于注册context一样:

// 1、注册相关服务,类似于如下的XXXContext的例子

services.AddDbContext<XXXContext>(XXX 。。。

// 2、controller读取

然后在具体controller的构造函数中作为参数获取。

类似于:

private IConfiguration _configuration;

public XXXController(IConfiguration configuration)

{
_configuration = configuration;
}

具体实现方式已有多篇文章讲解,请自行搜索,不再赘述。

这种方式引出两个问题:

1、多数controller是需要读取context的,但不是每个controller都需要读取配置文件,这种方式不够简洁

2、如果我们需要在controller之外的其他类文件中读取呢?

我们仿照ConfigurationManager读取Web.config中文件的方式,自定义一个MyConfigurationManager 类。

我直接在上一篇文章中的示例程序添加演示。

详细步骤

步骤一:准备好素材,appsettings.json添加配置项

"GrandParent_Key": { "Parent_Key": { "Child_Key": "value1" } },

"Parent_Key": { "Child_Key": "value2" },

"Child_Key": "value3"

步骤二:添加 MyConfigurationManager.cs

    /// <summary>

    /// 获取自定义的 json 配置文件

    /// </summary>

    static class MyConfigurationManager

    {

        public static IConfiguration AppSetting { get; }

        static MyConfigurationManager()

        {

            // 注意:2.2版本的这个路径不对 会输出 xxx/IIS Express...类似这种路径,

            // 等3.0再看有没其他变化

            string directory = Directory.GetCurrentDirectory();

            AppSetting = new ConfigurationBuilder()

                     .SetBasePath(directory)

                     .AddJsonFile("myAppSettings.json")

                     .Build();

        }

    }

步骤三:调用

我们去HomeController中添加一个测试方法

public IActionResult ConfigTest()

{

            string value1 = MyConfigurationManager.AppSetting["GrandParent_Key:Parent_Key:Child_Key"];

            string value2 = MyConfigurationManager.AppSetting["Parent_Key:Child_Key"];

            string value3 = MyConfigurationManager.AppSetting["Child_Key"];

            return View();

}

加个断点调试一下,可以看到输出了想要的结果。

总结

通过自定义的Configuration方法可以方便读取json文件。

获取配置文件路径时,AppContext.BaseDirectory在 .net core 2.2和2.1不一样,

如果事先用的2.2模板,需要右键项目,将target framework设为2.1

P.S. 路径获取这块给出一个通用的方法,这样2.1和2.2就都满足了,如下:

var fileName = "appsettings.json";

var directory = AppContext.BaseDirectory;

directory = directory.Replace("\\", "/");

var filePath = $"{directory}/{fileName}";

if (!File.Exists(filePath))

{

    var length = directory.IndexOf("/bin");

    filePath = $"{directory.Substring(0, length)}/{fileName}";

}

祝 学习进步 :)

P.S. 系列文章列表:https://www.cnblogs.com/miro/p/3777960.html

MVC + EFCore 完整教程19-- 最简方法读取json配置:自定义configuration读取配置文件的更多相关文章

  1. MVC+EFCore 完整教程18 -- 升级分布视图至 View Component

    之前我们详细介绍过分布视图(partial view),在有一些更加复杂的场景下,.net core为我们提供了更加强大的组件 view  component, 可以认为view component是 ...

  2. MVC + EFCore 项目实战 - 数仓管理系统2- 搭建基本框架配置EFCore

    本次课程就正式进入开发部分. 首先我们先搭建项目框架,还是和之前渐进式风格保持一致,除必备组件外,尽量使用原生功能以方便大家理解. 开发工具:vs 2019 或以上 数据库:SQL SERVER 20 ...

  3. 开源题材征集 + MVC&EF Core 完整教程小结

    到目前为止,我们的MVC+EF Core 完整教程的理论部分就全部结束了,共20篇,覆盖了核心的主要知识点. 下一阶段是实战部分,我们将会把这些知识点串联起来,用10篇(天)来完成一个开源项目. 现向 ...

  4. MVC+EFCore 项目实战-数仓管理系统1

    项目背景及需求说明 这是一个数据管理"工具类"的系统,计划有三个核心功能: 1.通过界面配置相关连接字符串,查询数据库的表数据. 2.配置相关模板,生成数据库表. 可以界面填报或通 ...

  5. MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用

    摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识. 第二阶段11-20篇将会侧重于专题的讲解,一篇文章解决一个实际问题. 根据园友的反馈, 本篇文章将会先对呼声最高的仓储模式进行讲解. 文 ...

  6. ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解

    原文 ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解 在教程的这一部分,我们将研究一下自动生成的 Details 和Delete 方法. Details 方法 打开M ...

  7. ASP.NET + MVC5 入门完整教程七 -—-- MVC基本工具(上)

    https://blog.csdn.net/qq_21419015/article/details/80474956 这里主要介绍三类工具之一的 依赖项注入(DI)容器,其他两类 单元测试框架和模仿工 ...

  8. ASP.NET + MVC5 入门完整教程三 (下) ---MVC 松耦合

    建立松耦合组件 MVC 模式最重要的特性之一视他支持关注分离,希望应用程序中的组件尽可能独立,只有很少的几个可控依赖项.在理想的情况下,每个组件都不了解其他组件,而只是通过抽象接口来处理应用程序的其他 ...

  9. Taurus.MVC WebAPI 入门开发教程4:控制器方法及参数定义、获取及基础校验属性【Require】。

    系列目录 1.Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...

随机推荐

  1. R035---偷个懒,用UiPath录制电脑操作过程,迅速实现流程自动化

    ​一.缘起 UiPath可以录制你操作电脑的过程,从而实现自动化. 目前有点鸡肋,因为有些操作过程无法录制,例如: 键盘快捷键 修改键 右键点击 鼠标悬停 即便如此,录制功能有时候还是可以用一下,特别 ...

  2. css基础4

    今天是2019年6月21日,周五了.在这里写上一篇随笔,主要内容是css基础中的一些细节部分,话不多说,直接上! 一.背景渐变: background-image 线性渐变:linear-gradie ...

  3. NOIp2018 TG day1 T2暨洛谷P5020 货币系统:题解

    题目链接:https://www.luogu.org/problemnew/show/P5020 这道题感觉比较水啊,身为普及组蒟蒻都不费力的做出来了,而且数据范围应该还能大一些,n起码几万几十万都不 ...

  4. 解决 mysql多表联合查询时出现的分页问题

    mysql一对多分页问题 部门表:tbl_dept 员工表:tbl_emp 数据库sql文件 CREATE DATABASE /*!32312 IF NOT EXISTS*/`ssm-crud` /* ...

  5. codemirror使用

    JS使用 使用bower下载 bower i codemirror 引入样式文件 <link rel="stylesheet" type="text/css&quo ...

  6. Go组件学习——cron定时器

    1 前言 转到Go已经将近三个月,写业务代码又找到了属于Go的条件反射了. 后置声明和多参数返回这些Go风格代码写起来也不会那么蹩脚,甚至还有点小适应~ 反而,前几天在写Java的时候,发现Java怎 ...

  7. nested exception is java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist

    org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ### The error may ...

  8. 【经验分享】ASP.NET 的 Page_Load 执行了2次,真的!

    发现问题 这是来自一位网友的提问: 本着求真务实的态度,我打开了 AppBoxPro 项目,本地调试果然发现 Page_Load 进入了两次! 其实在没测试之前,我就有了大概的方向,因为AppBoxP ...

  9. codeforces 355A Vasya and Digital Root

    题意就是找出一个长度为k的整数,使得它的root为d,k的可能取值为1-1000. 第一眼看到这个题,无从下手,想到那么长的数,暴力肯定超时.其实不然,题目要求只要输出任何一个满足条件的即可,因为任何 ...

  10. python使用pip安装第三方库以及镜像使用豆瓣源安装第三方库

    2018/8/7  在使用pip安装pynum第三方库时的随笔 所有的前提都是你成功安装了pip 首先第一步 打开命令提示符  输入pip show pip 查看当前pip版本 然后可以上官网搜索一下 ...