前言

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

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

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

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

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

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3.  
  4. services.Configure<BlogViewModel>(Configuration.GetSection("JeffckySettings"));
  5. ......
  6. }

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

.NET Core获取应用程序路径

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

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

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

  1. Directory.GetCurrentDirectory()

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

  1. AppContext.BaseDirectory

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

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

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

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

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

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

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

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

  1. //
  2. // 摘要:
  3. // Adds a new configuration source.
  4. //
  5. // 参数:
  6. // source:
  7. // The configuration source to add.
  8. //
  9. // 返回结果:
  10. // The same Microsoft.Extensions.Configuration.IConfigurationBuilder.
  11. public IConfigurationBuilder Add(IConfigurationSource source);

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

  1. //
  2. // 摘要:
  3. // Represents a JSON file as an Microsoft.Extensions.Configuration.IConfigurationSource.
  4. public class JsonConfigurationSource : FileConfigurationSource
  5. {
  6. public JsonConfigurationSource();
  7.  
  8. //
  9. // 摘要:
  10. // Builds the Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider
  11. // for this source.
  12. //
  13. // 参数:
  14. // builder:
  15. // The Microsoft.Extensions.Configuration.IConfigurationBuilder.
  16. //
  17. // 返回结果:
  18. // A Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider
  19. public override IConfigurationProvider Build(IConfigurationBuilder builder);
  20. }

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

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

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

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

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

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

  1. public class JsonConfigurationHelper
  2. {
  3. public T GetAppSettings<T>(string key) where T : class, new()
  4. {
  5. var baseDir = AppContext.BaseDirectory;
  6. var indexSrc = baseDir.IndexOf("src");
  7. var subToSrc = baseDir.Substring(, indexSrc);
  8. var currentClassDir = subToSrc + "src" + Path.DirectorySeparatorChar + "StutdyEFCore.Data";
  9.  
  10. IConfiguration config = new ConfigurationBuilder()
  11. .SetBasePath(currentClassDir)
  12. .Add(new JsonConfigurationSource { Path = "appsettings.json", Optional = false, ReloadOnChange = true })
  13. .Build();
  14. var appconfig = new ServiceCollection()
  15. .AddOptions()
  16. .Configure<T>(config.GetSection(key))
  17. .BuildServiceProvider()
  18. .GetService<IOptions<T>>()
  19. .Value;
  20. return appconfig;
  21. }
  22. }

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

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

结果如下:

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

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

总结

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

ASP.NET Core实现类库项目读取配置文件的更多相关文章

  1. asp.net core 2.0类库项目读取配置文件

    1.首先在类库项目中添加 这3个库. 2.在类库项目中添加AppSetting.cs.代码如下: using Microsoft.Extensions.Configuration;using Syst ...

  2. .NET Core在类库中读取配置文件appsettings.json

    在.NET Framework框架时代我们的应用配置内容一般都是写在Web.config或者App.config文件中,读取这两个配置文件只需要引用System.Configuration程序集,分别 ...

  3. ASP.NET Core轻松入门Bind读取配置文件到C#实例

    首先新建一个ASP.NET Core空项目,命名为BindReader 然后 向项目中添加一个名为appsettings.json的json文件,为什么叫appsettings呢?  打开Progra ...

  4. Asp.net Core 和类库读取配置文件信息

    Asp.net Core 和类库读取配置文件信息 看干货请移步至.net core 读取配置文件公共类 首先开一个脑洞,Asp.net core 被使用这么长时间了,但是关于配置文件(json)的读取 ...

  5. IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题

    IT咨询顾问:一次吐血的项目救火   年后的一个合作公司上线了一个子业务系统,对接公司内部的单点系统.我收到该公司的技术咨询:项目启动后没有规律的突然无法登录了,重新启动后,登录一断时间后又无法重新登 ...

  6. .Net Core库类项目跨项目读取配置文件

    在项目开始之前我们可以先去了解一下IConfiguration接口,.Net Core Web应用程序类似于一个控制台,当程序运行到Startup时会自动注入IConfiguration,默认读取当前 ...

  7. .NET Core类库中读取配置文件

    最近在开发基于.NET Core的NuGet包,遇到一个问题:.NET Core中已经没有ConfigurationManager类,在类库中无法像.NET Framework那样读取App.conf ...

  8. Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录

    1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...

  9. Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例

    本文目录 1. Net下日志记录 2. NLog的使用     2.1 添加nuget引用NLog.Web.AspNetCore     2.2 配置文件设置     2.3 依赖配置及调用     ...

随机推荐

  1. 开源一个vue2的tree组件

    一直打算偷懒使用个现成的树组件,但是在github上找了一大圈没有找到真正满足应用开发的树组件,所以没办法只能自己写了一个,开源出来希望可以帮助到需要的人,同时如果大家觉得好用,我可以顺带骗骗★(希望 ...

  2. datatables,表格

    官方文档:https://datatables.net/ var dttblTaskOrderOptions={ order: [5, 'desc'], ajax:{ url:"order/ ...

  3. Unity利用Sapi进行windows语音开发

    软件中的语音技术主要包含两种:语音识别speech recognition和语音合成speech synthesis.一般地,开发者会因为技术实力和资金实力等各方面的问题无力完成专业的语音引擎,因此通 ...

  4. OpenCV局部变形算法探究

    OpenCV是跨平台的强大的计算机视觉识别和图像处理的开源库,可以利用他来实现:模式识别.构建神经网络.深度学习,总之用途多多,入门级就先做一下图像处理吧! 基本的图像处理算法(图像灰阶化.二值化.仿 ...

  5. RBAC打造通用WEB权限

    RBAC不用给用户单个分配权限,只用指向对应的角色就会有对应的权限,而且分配权限和收回权限都很方便 5个关系对应5张表 五张表设计 CREATE TABLE `user` ( `id` ) unsig ...

  6. JDBC基础学习(二)—PreparedStatement

    一.PreparedStatement介绍     在SQL中包含特殊字符或SQL的关键字(如: ' or 1 or ')时Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用P ...

  7. 实现一个竖直的显示表头的表格(vue版本)

    今天遇到一个问题,实现这样一个竖直的显示表头的表格,如下图.默认显示两列. vue实现代码如下:   tableComponent.vue:   <template> <table ...

  8. php常用的优化手段

    由于工作码成狗,抽闲整理了下内容,以下是网上流传比较广泛的30种SQL查询语句优化方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. ...

  9. NOIP2009T3最优贸易

    洛谷传送门 看到这个题,原本想先从后往前dfs,求出能到终点的点,再在这些点里从前往后spfa,用一条边上的两个城市的商品价格的差来作边权,实施过后,发现图中既有负边权,又有回路,以及各种奇奇怪怪的东 ...

  10. win8.1启用ahci后蓝屏

    先简单介绍一下,本应该win7开始,系统安装的时候默认就启用了ahci硬盘模式.但是博主犯了傻,装了win8.1后安装win XP形成双系统.xp并不支持ahci模式,所以将硬盘模式改成了IDE模式, ...