前言
之前继续在学习多线程方面的知识,忽然这两天看到博问中有个园友问到如何在.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实现类库项目读取配置文件的更多相关文章
-
asp.net core 2.0类库项目读取配置文件
1.首先在类库项目中添加 这3个库. 2.在类库项目中添加AppSetting.cs.代码如下: using Microsoft.Extensions.Configuration;using Syst ...
-
.NET Core在类库中读取配置文件appsettings.json
在.NET Framework框架时代我们的应用配置内容一般都是写在Web.config或者App.config文件中,读取这两个配置文件只需要引用System.Configuration程序集,分别 ...
-
ASP.NET Core轻松入门Bind读取配置文件到C#实例
首先新建一个ASP.NET Core空项目,命名为BindReader 然后 向项目中添加一个名为appsettings.json的json文件,为什么叫appsettings呢? 打开Progra ...
-
Asp.net Core 和类库读取配置文件信息
Asp.net Core 和类库读取配置文件信息 看干货请移步至.net core 读取配置文件公共类 首先开一个脑洞,Asp.net core 被使用这么长时间了,但是关于配置文件(json)的读取 ...
-
IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题
IT咨询顾问:一次吐血的项目救火 年后的一个合作公司上线了一个子业务系统,对接公司内部的单点系统.我收到该公司的技术咨询:项目启动后没有规律的突然无法登录了,重新启动后,登录一断时间后又无法重新登 ...
-
.Net Core库类项目跨项目读取配置文件
在项目开始之前我们可以先去了解一下IConfiguration接口,.Net Core Web应用程序类似于一个控制台,当程序运行到Startup时会自动注入IConfiguration,默认读取当前 ...
-
.NET Core类库中读取配置文件
最近在开发基于.NET Core的NuGet包,遇到一个问题:.NET Core中已经没有ConfigurationManager类,在类库中无法像.NET Framework那样读取App.conf ...
-
Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录
1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...
-
Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例
本文目录 1. Net下日志记录 2. NLog的使用 2.1 添加nuget引用NLog.Web.AspNetCore 2.2 配置文件设置 2.3 依赖配置及调用 ...
随机推荐
-
安卓gridview 网格,多行多列实现
主Activity() private int[] image = { R.drawable.camera, R.drawable.wifi, R.drawable.temperature, R.dr ...
-
漂浮QQ
漂浮QQ 点击下载
-
CSS3设置字体
@font-face{ font-family: myFirstFont;src: url('Sansation_Light.ttf') ,url('Sansation_Light.eot'); ...
-
把一个窗体嵌入到WinForm中进行显示,以CMD窗口为例
1.添加引用 using System.Runtime.InteropServices; 2. 加入以下代码段 [DllImport("User32.dll ", EntryPoi ...
-
php版权重轮询调度算法
2013-09-25 <?php class WeightedRoundRobin { private static $_weightArray = array(); private stati ...
-
正则取页面图片URL和TABLE BackGround
/// <summary> /// 根据html文本返回url地址集合 /// </summary> /// <param name="sHtmlText&qu ...
-
接口自动化python
!/usr/bin/env python coding=utf-8 Todo:接口自动化测试 Author:归根落叶 Blog:http://this.ispenn.com import json i ...
-
SAS 数据集生成map 文件
OPTIONS NOCENTER PS=MAX LS=MAX; LIBNAME S '.'; DATA A; INPUT X $ @@; CARDS;A1 A2 A3 B1 B2 B3 ...
-
Python线程,进程,携程,I/O同步,异步
只有本人能看懂的-Python线程,进程,携程,I/O同步,异步 举个栗子: 我想get三个url,先用普通的for循环 import requests from multiprocessing im ...
-
Mac通过wifi连接 Android设备
公司用的全是mac开发,但是全是type-C接口,每次背电脑回家啊,还得带个数据线转换器…… 想着回来,直接通过Wi-Fi连接手机就好,发现完全忘了之前套路,现在赶紧记下一波,保证包教包会! STEP ...