如何在ASP.NET Core类库项目中读取配置文件详解

前言

最近有朋友问如何在.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.JsonConfigurationProvider
  public 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配置中的数据但是还是有点不足,你有何高见?

(0)

相关推荐

  • 详解ASP.NET Core 在 JSON 文件中配置依赖注入

    前言 在上一篇文章中写了如何在MVC中配置全局路由前缀,今天给大家介绍一下如何在在 json 文件中配置依赖注入. 在以前的 ASP.NET 4+ (MVC,Web Api,Owin,SingalR等)时候,都是提供了专有的接口以供使用第三方的依赖注入组件,比如我们常用的会使用 Autofac.Untiy.String.Net 等,这些第三放依赖注入组件基本上都提供了一套配置注入或者配置生命周期的方式,除了直接配置到类里面之外,还提供了要么使用 xml 文件,要么使用 json 等,那么在新的

  • ASP.NET core Web中使用appsettings.json配置文件的方法

    前言 最近在研究把asp.net程序移植到linux上,正好.net core出来了,就进行了学习. 移植代码基本顺利,但是发现.net core中没有ConfigurationManager,无法读写配置文件,单独写个xml之类的嫌麻烦,就谷歌了下,发现了个方法,遂记录如下,方便以后查找: 方法如下 配置文件结构 public class DemoSettings { public string MainDomain { get; set; } public string SiteName {

  • .NET Core 2.0迁移小技巧之web.config 配置文件示例详解

    前言 相信大家应该都知道.NET Core现在不再支持原来的web.config配置文件了,取而代之的是json或xml配置文件.官方推荐的项目配置方式是使用appsettings.json配置文件,这对现有一些重度使用web.cofig配置的项目迁移可能是不可接受的. 但是好消息是,我们是可以直接在.NET Core 2.0项目种利用上现有的web.config的.本文将详细介绍.NET Core 2.0迁移之web.config 配置文件的相关内容,下面话不多说了,来一起看看详细的介绍吧.

  • 如何在ASP.NET Core类库项目中读取配置文件详解

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

  • .NET Core类库项目中读取appsettings.json配置的方法

    这是一位朋友问我的问题,写篇随笔回答一下.有2种方法,一种叫丑陋的方法 ——IConfiguration ,一种叫优雅的方法 —— IOptions . 1)先看丑陋的方法 比如在RedisClient 中需要读取appsettings.json 中的 redis 连接字符串: { "redis": { "ConnectionString": "xxx" } } 需要在RedisClient 的构造函数参数中添加IConfiguration 接口

  • 详解如何在ASP.NET Core Web API中以三种方式返回数据

    在 ASP.NET Core 中有三种返回 数据 和 HTTP状态码 的方式,最简单的就是直接返回指定的类型实例,如下代码所示: [ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { [HttpGet] public IEnumerable<WeatherForecast> Get() { var rng = new Random()

  • ASP.NET Core WebSocket集群实现思路详解

    目录 前言 实现 nginx配置 一对一发送 群组发送 发送所有人 整合到一起 一对一处理 群组处理 全员消息处理 示例源码 总结 前言 提到WebSocket相信大家都听说过,它的初衷是为了解决客户端浏览器与服务端进行双向通信,是在单个TCP连接上进行全双工通讯的协议.在没有WebSocket之前只能通过浏览器到服务端的请求应答模式比如轮询,来实现服务端的变更响应到客户端,现在服务端也可以主动发送数据到客户端浏览器.WebSocket协议和Http协议平行,都属于TCP/IP四层模型中的第四层

  • bing Map 在vue项目中的使用详解

    写在最前面 拥有全球数据库国内好像就只有百度地图有,高德.搜狗.腾讯的都不行,但是由于百度地图的数据更新不及时,所以在做相关项目要用到国外数据的时候,最好还是推荐使用bingMap. bing Map 使用教程(基础) 参考文档:bing Map 官方教程 bing Map 初始化 引入bing map资源 <script type='text/javascript' src='http://www.bing.com/api/maps/mapcontrol?callback=GetMap&k

  • MVVM和MVVMLight框架介绍及在项目中的使用详解

    一.MVVM 和 MVVMLight介绍 MVVM是Model-View-ViewModel的简写.类似于目前比较流行的MVC.MVP设计模式,主要目的是为了分离视图(View)和模型(Model)的耦合. 它是一种极度优秀的设计模式,但并非框架级别的东西,由MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构. 立足于原有MVP框架并且把WPF的新特性糅合进去,以应对PC端开发日益复杂的需求变化. 结构如图所示: 相对于之前把逻辑结构写在Co

  • npm脚本库组织在项目中的地位详解

    目录 一.脚本的地位 二.“脚本调度”的难题 三.如此简单? 四.此剑名曰: npm-run-all 4.1 安装 4.2 第一个命令: npm-run-all 4.3 第二个命令:npm-s 4.4 第三个命令:npm-p 4.5 通配符 4.6 更多实用能力 一.脚本的地位 脚本是 项目真正的入口 . 无论你是刚刚 clone 完公司的项目,抑或是你准备在开源社区做一点微小的贡献:你需要做的第一件事,永远是: 打开 package.json,看看 scripts 里都有哪些脚本. 有些脚本负

  • MyBatis 中 SqlMapConfig 配置文件详解

    0x00:文件介绍 在 WEB 工程中,对于 MyBatis 最核心的全局配置文件是 SqlMapConfig.xml 文件,其中包含了数据库的连接配置信息.Mapper 映射文件的加载路径.全局参数.类型别名等. 0x01:配置项详解 configuration:包裹所有配置标签,是整个配置文件的顶级标签. properties:属性,该标签可以引入外部配置的属性,也可以自己配置.该配置标签所在的同一个配置文件中的其他配置均可引用此配置中的属性. setting:全局配置参数,用来配置一些改变

  • ASP.NET Core使用HostingStartup增强启动操作方法详解

    概念 在ASP.NET Core中我们可以使用一种机制来增强启动时的操作,它就是HostingStartup.如何叫"增强"操作,相信了解过AOP概念的同学应该都非常的熟悉.我们常说AOP使用了关注点分离的方式,增强了对现有逻辑的操作.而我们今天要说的HostingStartup就是为了"增强"启动操作,这种"增强"的操作甚至可以对现有的程序可以做到无改动的操作.例如,外部程序集可通过HostingStartup实现为应用提供配置服务.注册服务或

  • 如何给ASP.NET Core Web发布包做减法详解

    1.引言 紧接上篇:ASP.NET Core Web App应用第三方Bootstrap模板.这一节我们来讲讲如何优化ASP.NET Core Web发布包繁重的问题. 在ASP.NET Core Web App中我们可以通过Bower或NPM来安装一些JS.CSS插件,来方便我们组织前端组件.但是这也给我带来了一个问题,那就是发布时需要把安装的Bower包或NPM包都要打包上传到服务器. 如果现在发布ASP.NET Core Web App,wwwroot下已包含到项目中的文件都会被发布.虽然

随机推荐