媒介
近来有朋侪问如安在.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");
总结
以上就是ASP.NET Core类库项目中怎样完成读取设置文件的详解的细致内容,更多请关注ki4网别的相干文章!