前言

之前继续在学习多线程方面的知识,忽然这两天看到博问中有个园友问到如何在.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(, 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配置中的数据但是还是有点不足,你有何高见?

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. 区分 点操作符+属性名 和 getAttribute()

    在用DOM操作控制HTML时,很多初学者会把 点操作符+属性名 与getAttribute("属性名") 混淆,误以为这两种方法是等价的. 实际上, 通过getAttribute( ...

  2. 实践 config drive - 每天5分钟玩转 OpenStack(170)

    如果 instance 无法通过 metadata service 获取 metadata(无 DHCP 或者 nova-api-metadata 服务),instance 还可以通过 config ...

  3. Zkui安装

    是一个允许在zookeeper上进行增删查改操作的图形管理工具,与zkdash类似. 1.拉取代码 #git clone https://github.com/DeemOpen/zkui.git 2. ...

  4. JSTL 核心标签库 使用(转)

    在JSP的开发中,迭代是经常要使用到的操作.例如,逐行的显示查询的结果等.在早期的JSP中,通常使用Scriptlets来实现Iterator或者Enumeration对象的迭代输出.现在,通过JST ...

  5. C#调用webbrowser,阻止弹出新IE窗口

    本人是用WPF内嵌 winform的webbrowser这种形式开发, 弹出的 //屏蔽弹出新IE窗口 private void webBrowser_NewWindow(object sender, ...

  6. Shell 学习笔记之变量

    变量 知识点 变量赋值和输出 variable="hello world" echo $variable 或者 echo ${variable} (最后格式统一使用后者) 只读变量 ...

  7. Ubuntu下php网站运行环境搭建

    第一步:查看是否安装lamp相关软件: dpkg -s 软件名称,比如php.mysql.apache. dpkg-query -l 软件名称 要列出你系统中安装的所有包,输入下面的命令:dpkg - ...

  8. SQLite 数据库

    内容来源:高成珍.钟元生<Android编程经典案例解析> SQLite 数据库是Android 中内嵌的轻量级关系型数据库,本质上只是一个文件.SQLite 内部只支持NULL,INTE ...

  9. lambda和委托

    Lambda 简介 Lambda 表达式是一种可用于创建委托或表达式目录树类型的一种匿名函数(匿名方法+Lambda).通过使用 lambda 表达式,可以写入可作为参数传递或作为函数 调用值返回的本 ...

  10. es6基础系列一:let和const

    let 声明变量,可以说是具有作用域的var,用于声明变量,主要规则如下: 1 let声明的变量拥有块级作用域 { let i = 1; console.log(i); // 1 } console. ...