ASP.NET Core实现类库项目读取配置文件

前言

以前继续在学习多线程方面的知识,突然这两天看到博问中有个园友问到如何在.net core类库中读取配置文件,当时一下蒙了,这个提的多好,我竟然不知道,因而这两天了解了相关内容才有此篇博客的出现,正常来说咱们在应用程序目录下有个appsettings.json文件对于相关配置都会放在这个json文件中,可是要是我创建一个类库项目,对于一些配置好比密钥或者其余须要硬编码的数据放在JSON文件中,在.net core以前配置文件为web.config而且有相关的类来读取节点上的数据,现现在在.net core中为json文件,那么咱们该如何作?本文就此应运而生。web

.NET Core类库项目读取JSON配置文件

在应用程序目录下添加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中是如何获取应用程序路径的。app

.NET Core获取应用程序路径

在.NET 4.X以前获取当前应用程序根目录路径和名称能够经过以下获取ide

var basePath = AppDomain.CurrentDomain.BaseDirectory;
var appName = AppDomain.CurrentDomain.ApplicationIdentity.FullName;

固然也能够经过以下来获取应用程序根目录而不是获得bin目录学习

Directory.GetCurrentDirectory()

在.net core中获取bin目录路径经过以下来获取更加简洁。测试

AppContext.BaseDirectory

在.NET 4.X以前获取应用程序集名称经过以下来获取:ui

Assembly.GetEntryAssembly().GetName().Name;

在.net core中经过以下来获取:this

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配置中的数据可是仍是有点不足,你有何高见?

相关文章
相关标签/搜索