MVC + EFCore 完整教程19-- 最简方法读取json配置:自定义configuration读取配置文件
问题引出
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读取配置文件的更多相关文章
- MVC+EFCore 完整教程18 -- 升级分布视图至 View Component
之前我们详细介绍过分布视图(partial view),在有一些更加复杂的场景下,.net core为我们提供了更加强大的组件 view component, 可以认为view component是 ...
- MVC + EFCore 项目实战 - 数仓管理系统2- 搭建基本框架配置EFCore
本次课程就正式进入开发部分. 首先我们先搭建项目框架,还是和之前渐进式风格保持一致,除必备组件外,尽量使用原生功能以方便大家理解. 开发工具:vs 2019 或以上 数据库:SQL SERVER 20 ...
- 开源题材征集 + MVC&EF Core 完整教程小结
到目前为止,我们的MVC+EF Core 完整教程的理论部分就全部结束了,共20篇,覆盖了核心的主要知识点. 下一阶段是实战部分,我们将会把这些知识点串联起来,用10篇(天)来完成一个开源项目. 现向 ...
- MVC+EFCore 项目实战-数仓管理系统1
项目背景及需求说明 这是一个数据管理"工具类"的系统,计划有三个核心功能: 1.通过界面配置相关连接字符串,查询数据库的表数据. 2.配置相关模板,生成数据库表. 可以界面填报或通 ...
- MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用
摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识. 第二阶段11-20篇将会侧重于专题的讲解,一篇文章解决一个实际问题. 根据园友的反馈, 本篇文章将会先对呼声最高的仓储模式进行讲解. 文 ...
- ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解
原文 ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解 在教程的这一部分,我们将研究一下自动生成的 Details 和Delete 方法. Details 方法 打开M ...
- ASP.NET + MVC5 入门完整教程七 -—-- MVC基本工具(上)
https://blog.csdn.net/qq_21419015/article/details/80474956 这里主要介绍三类工具之一的 依赖项注入(DI)容器,其他两类 单元测试框架和模仿工 ...
- ASP.NET + MVC5 入门完整教程三 (下) ---MVC 松耦合
建立松耦合组件 MVC 模式最重要的特性之一视他支持关注分离,希望应用程序中的组件尽可能独立,只有很少的几个可控依赖项.在理想的情况下,每个组件都不了解其他组件,而只是通过抽象接口来处理应用程序的其他 ...
- Taurus.MVC WebAPI 入门开发教程4:控制器方法及参数定义、获取及基础校验属性【Require】。
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
随机推荐
- Uncaught Error: Bootstrap dropdown require Popper.js
Bootstrap 要求Popper.js 如果安装了Popper.js还报错,肯定就是Popper的问题 https://cdn.bootcss.com/popper.js/1.12.5/umd/p ...
- 数组指针&&指针数组
数组指针: 定义 int (*p)[n]; 占用内存中一个指针的存储空间 ()优先级高,首先说明p是一个指针,指向一个int型的一维数组,故名数组(的)指针.指向的一维数组的长度是n,也可以 ...
- Linux基础学习整理
linux学习记录 下载地址 centos 下载地址: 网易镜像:http://mirrors.163.com/centos/6/isos/ 搜狐镜像:http://mirrors.sohu.com/ ...
- window平台下 cmd 命令窗口的编码设置
在WINDOWS上打开控制台界面,发现默认的编码是GBK,这样有时候写完的代码运行的时候就会出码,基于此,查阅各方资料,终于得出两种方案. 一.临时解决方案(只针对本次会话有效) 1. 打开控制台,输 ...
- File文件类
目录 File文件类 File类的构造方法 File类的创建功能 File类的重命名 File类的删除功能 File类的判断功能 File类的获取功能 文件名称过滤器 File文件类 File:文件和 ...
- thinkphp 数据库操作
//所有的数据中,查出某个字段$result = $music->field('music')->select();$hotlist = M('News')->where('stat ...
- HashSet源码解读
一:先看其实现了哪些接口和继承了哪些类 1.实现了Serializable接口,表明它支持序列化. 2.实现了Cloneable接口,表明它支持克隆,可以调用超类的clone()方法进行浅拷贝. 3. ...
- java练习---13
public class Y { public static void main(String[] args) { // TODO Auto-generated method stub new Y() ...
- 第三章 基础算法和数据结构高频题 I
区间类问题 1 Missing Interval public List<String> findMissingRanges(int[] nums, int lower, int uppe ...
- Heap Greedy
1 239 Sliding Window Maximun 双端队列 public int[] maxSlidingWindow(int[] nums, int k) { if (nums == nul ...