前言

之前继续在学习多线程方面的知识,忽然这两天看到博问中有个园友问到如何在.net core类库中读取配置文件,当时一下蒙了,这个提的多好,我居然不知道,于是这两天了解了相关内容才有此篇博客的出现,正常来讲我们在应用程序目录下有个appsettings.json文件对于相关配置都会放在这个json文件中,但是要是我建立一个类库项目,对于一些配置比如密钥或者其他需要硬编码的数据放在JSON文件中,在.net core之前配置文件为web.config并且有相关的类来读取节点上的数据,现如今在.net core中为json文件,那么我们该如何做?本文就此应运而生。

.NET Core类库项目读取JSON配置文件

在应用程序目录下添加JSON文件是进行如下配置:

                var builder = new ConfigurationBuilder().SetBasePath(env.ContentRootPath).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true).AddEnvironmentVariables();Configuration = builder.Build();

然后读取配置文件的节点,如下:

        public void ConfigureServices(IServiceCollection services){services.Configure<BlogViewModel>(Configuration.GetSection("JeffckySettings"));......}

但是如果项目是在类库中呢,当然我们也可以将配置值放在应用程序下的appsettings.json中,但是为了不让其json文件中看起来显得非常臃肿同时在类库中的配置数据我们理应放在类库中来统一管理,所以我们得另外再想方案,总不能在类库中建立startup.cs类,再来实例化Configuration吧,这样想想应该也是可以,我没尝试过,难道就没有很简单的方式么,难道就不能像.net core之前用类来读取web.config我们只需要给出键而得到值吗?或者说通过强类型配置来统一管理配置数据,这个才应该是我们尝试的方向。好了,说了这么多,我们就开干。我们首先来复习下.net core中是如何获取应用程序路径的。

.NET Core获取应用程序路径

在.NET 4.X之前获取当前应用程序根目录路径和名称可以通过如下获取

var basePath = AppDomain.CurrentDomain.BaseDirectory;
var appName = AppDomain.CurrentDomain.ApplicationIdentity.FullName;

当然也可以通过如下来获取应用程序根目录而不是得到bin目录

Directory.GetCurrentDirectory()

在.net core中获取bin目录路径通过如下来获取更加简洁。

AppContext.BaseDirectory

在.NET 4.X之前获取应用程序集名称通过如下来获取:

Assembly.GetEntryAssembly().GetName().Name;

在.net core中通过如下来获取:

var name = typeof(T).GetTypeInfo().Assembly.GetName().Name;

版本通过如下来获取(.net core也一样):

Assembly.GetEntryAssembly().GetName().Version.ToString()

在类库项目中我们利用强类型配置来实现读取配文件数据,我们首先需要下载如下扩展。

在ConfigurationBuilder类中如下一个Add添加方法:

         //// 摘要://     Adds a new configuration source.//// 参数://   source://     The configuration source to add.//// 返回结果://     The same Microsoft.Extensions.Configuration.IConfigurationBuilder.public IConfigurationBuilder Add(IConfigurationSource source);

对于 AddJsonFile 扩展方法来添加JSON文件名,文件路径已经通过 SetBasePath() 方法来实现,一切配置都是基于 IConfigurationBuilder 接口,其中就有一个 JsonConfigurationSource 类,实现如下:

 //// 摘要://     Represents a JSON file as an Microsoft.Extensions.Configuration.IConfigurationSource.public class JsonConfigurationSource : FileConfigurationSource{public JsonConfigurationSource();//// 摘要://     Builds the Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider//     for this source.//// 参数://   builder://     The Microsoft.Extensions.Configuration.IConfigurationBuilder.//// 返回结果://     A Microsoft.Extensions.Configuration.Json.JsonConfigurationProviderpublic override IConfigurationProvider Build(IConfigurationBuilder builder);}

我们再看其父类就有一个添加JSON文件路径的方法,如下:

所以我们从这里可以看出添加JSON文件的方法除了通过扩展方法来实现外还有直接实例化JsonConfigurationSource来实现,如下:

IConfiguration config = new ConfigurationBuilder().SetBasePath(currentClassDir) .AddJsonFile("appsettings.json", false, true).Add(new JsonConfigurationSource { Path = "appsettings.json", Optional = false, ReloadOnChange = true }).Build();

上述添加JSON文件皆可,我发现添加JSON文件必须设置JSON文件所在的目录即必须首先要设置 SetBasePath 方法,否则会报如下错误:

我们搞个测试JSON文件放在当前项目(StudyEFCore.Data)中如下:

最终读取类库项目JSON配置文件,将其封装起来就成了如下这个样子:

    public class JsonConfigurationHelper{public T GetAppSettings<T>(string key) where T : class, new(){var baseDir = AppContext.BaseDirectory;var indexSrc = baseDir.IndexOf("src");var subToSrc = baseDir.Substring(0, indexSrc);var currentClassDir = subToSrc + "src" + Path.DirectorySeparatorChar + "StutdyEFCore.Data";IConfiguration config = new ConfigurationBuilder().SetBasePath(currentClassDir).Add(new JsonConfigurationSource { Path = "appsettings.json", Optional = false, ReloadOnChange = true }).Build();var appconfig = new ServiceCollection().AddOptions().Configure<T>(config.GetSection(key)).BuildServiceProvider().GetService<IOptions<T>>().Value;return appconfig;}}

由上有一个还未解决的问题就是如何得到当前类库项目的路径,没有想到一个好的法子,不知看到此文的你有何高见。简短的调用则是如下:

            var config = new JsonConfigurationHelper();var person = config.GetAppSettings<Person>("JeffckySettings");var name = person.Name;var age = person.Age;

结果如下:

我们将其类修改为 ConfigurationManager ,然后将其 GetAppSettings 方法定义为静态方法,最后如下调用是不是满足了在.net core之前读取web.config中配置数据的问题。哈哈哈:

 var person = ConfigurationManager.GetAppSettings<Person>("JeffckySettings");

总结

本节我们详细讲解了在.net core类库项目中如何读取JSON配置中的数据但是还是有点不足,你有何高见?

本文转自Jeffcky博客园博客,原文链接:http://www.cnblogs.com/CreateMyself/p/6859076.html,如需转载请自行联系原作者

ASP.NET Core实现类库项目读取配置文件相关推荐

  1. Asp.Net Core 轻松学-玩转配置文件

    目录 前言 另类方式使用 hosting.json 使程序运行于多个端口 结语 前言     在 .NET Core 项目中,配置文件有着举足轻重的地位:与.NetFramework 不同的是,.NE ...

  2. core webapi缩略图_在ASP.NET Core Web API 项目里无法访问(wwwroot)下的文件

    新建 ASP.NET Core Web API 项目 -- RESTFul 风格 Hello World! 一.创建一个空项目 请查看 新建 .NET Core 项目 -- Hello World!  ...

  3. 解决Spring项目读取配置文件中文乱码问题

    解决Spring项目读取配置文件中文乱码问题 properties配置文件读取时中文乱码,错误如下: 解决方法如下: **1.**打开IDEA的设置项,进入Editor->File encodi ...

  4. ASP.NET Core 介绍和项目解读

    1. 前言 2. ASP.NET Core 简介 2.1 什么是ASP.NET Core 2.2 ASP.NET Core的特点 2.3 ASP.NET Core 项目文件夹解读 2.3.1 项目文件 ...

  5. Asp.NET Core 轻松学-项目目录和文件作用介绍

    前言     上一章介绍了 Asp.Net Core 的前世今生,并创建了一个控制台项目编译并运行成功,本章的内容介绍 .NETCore 的各种常用命令.Asp.Net Core MVC 项目文件目录 ...

  6. ASP.NET Core 开源论坛项目 NETCoreBBS

    ASP.NET Core 轻量化开源论坛项目,ASP.NET Core Light forum NETCoreBBS 采用 ASP.NET Core + EF Core Sqlite + Bootst ...

  7. .NET Core 6.0之读取配置文件

    在ASP.NET Core 6.0中,默认配置文件是appsettings.json,该文件存储的内容为JSON格式的字符串,我们一般都将程序的配置放在这个文件里面,提供给程序使用,那么我们该如何操作 ...

  8. ASP.NET Core 2.2 项目升级至 3.0 备忘录

    .NET Core 3.0及ASP.NET Core 3.0 前瞻 ASP.NET Core 3.0 迁移避坑指南 将 ASP.NET Core 2.2 迁移至 ASP.NET Core 3.0 需要 ...

  9. [译]使用LazZiya.ExpressLocalization开发多语言支持的ASP.NET Core 2.x项目

    介绍 开发多语言支持的ASP.NET Core 2.x Web应用程序需要大量的基础架构设置,并且耗费时间和精力.这篇文章,我们将使用LazZiya.ExpressLocalization nuget ...

最新文章

  1. 一个项目涉及到的50个Sql语句(整理版)
  2. android 定位服务 耗电吗,关于Android的定位服务
  3. 推荐系统笔记(简单概念)
  4. 线性复杂度的素数筛选法
  5. 【工具类】工具相关参考文档汇总
  6. Go 语言学习笔记(一):基础知识
  7. linux kill命令使用方法,Linux初学者的killall命令(8个例子)
  8. python37从零开始学_从零开始学Python【37】--朴素贝叶斯模型(理论部分)
  9. 液晶显示屏的C语言编码,单片机液晶汉字显示c语言程序
  10. 多厂商云成本管理窍门
  11. 学安全测试需要多少钱?安全测试培训费一般多少?
  12. 磁场发生装置电磁铁简介及工作原理
  13. 实现选择文本时选中整个元素文本
  14. 网络舆情传播路径渠道与动态监测的方法
  15. 对称加密非对称加密混合加密
  16. Centos 6、7 配置BBR加速
  17. 软件测试公司都会查学历吗,高新技术企业申请会查员工学历吗?申请高新技术企业注意事项解读...
  18. 三七互娱 2021秋招 游戏测试
  19. 2022T电梯修理考试题库及模拟考试
  20. 路由器的工作原理——微云网络

热门文章

  1. 语法分析生成器 - LEX
  2. visual tree view在工具箱力没有_Visual-Inertial Odometry
  3. 目标检测--边界框(bounding box)解析
  4. SLAM学习--常用数据集
  5. 北斗导航 | 从存储的log日志(NMEA0183标准输出)中获取经纬度并在地图中绘制坐标轨迹(附Matlab源代码)
  6. 设计模式——UML图
  7. Python 网络爬虫笔记4 -- 信息标记与提取
  8. AI理论知识整理(2)-对称矩阵-特征值与特征向量
  9. 【机器学习】人工智能典型应用:班组工作日志转绩效类型
  10. 【Python】如何用python做一个简单的输入输出交互界面?