视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
如何在ASP.NET Core类库项目中读取配置文件详解
2020-11-27 22:35:17 责编:小采
文档


前言

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

下载本文
显示全文
专题