如何在ASP.NET Core类库项目中读取配置文件详解
前言
最近有朋友问如何在. core类库中读取配置文件,当时一下蒙了,这个提的多好,我居然不知道,于是这两天了解了相关内容才有此篇文章的出现,正常来讲我们在应用程序目录下有个appsettings.json文件对于相关配置都会放在这个json文件中,要是我建立一个类库项目,对于一些配置比如密钥或者其他需要硬编码的数据放在JSON文件中,在. core之前配置文件为web.config并且有相关的类来读取节点上的数据,现如今在. 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吧,这样想想应该也是可以,我没尝试过,难道就没有很简单的方式么,难道就不能像. core之前用类来读取web.config我们只需要给出键而得到值吗?或者说通过强类型配置来统一管理配置数据,这个才应该是我们尝试的方向。好了,说了这么多,我们就开干。我们来复习下. core中是如何获取应用程序路径的。
.NET Core获取应用程序路径
在.NET 4.X之前获取当前应用程序根目录路径和名称可以通过如下获取
var basePath = AppDomain.CurrentDomain.BaseDirectory; var appName = AppDomain.CurrentDomain.ApplicationIdentity.FullName;
也可以通过如下来获取应用程序根目录而不是得到bin目录
Directory.GetCurrentDirectory()
在. core中获取bin目录路径通过如下来获取更加简洁。
AppContext.BaseDirectory
在.NET 4.X之前获取应用程序集名称通过如下来获取
Assembly.GetEntryAssembly().GetName().Name;
在. core中通过如下来获取
var name = typeof(T).GetTypeInfo().Assembly.GetName().Name;
版本通过如下来获取(. 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方法定义为静态方法,如下调用是不是满足了在. core之前读取web.config中配置数据的问题。哈哈哈
var person = ConfigurationManager.GetAppSettings<Person>("JeffckySettings");
本节我们详细讲解了在. core类库项目中如何读取JSON配置中的数据还是有点不足,你有何高见?
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程