开发者社区> 科技探索者> 正文

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

简介:
+关注继续查看

.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");

本文转自帅气的头头博客51CTO博客,原文链接http://blog.51cto.com/12902932/1926492如需转载请自行联系原作者

sshpp

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ASP.NET Core : 一. 概述
ASP.NET Core : 一. 概述
75 0
ASP.NET MVC (五、HttpClient接口解析)(6)
ASP.NET MVC (五、HttpClient接口解析)(6)
123 0
ASP.NET MVC (五、HttpClient接口解析)(5)
ASP.NET MVC (五、HttpClient接口解析)(5)
78 0
ASP.NET MVC (五、HttpClient接口解析)(4)
ASP.NET MVC (五、HttpClient接口解析)(4)
32 0
ASP.NET MVC (五、HttpClient接口解析)(3)
ASP.NET MVC (五、HttpClient接口解析)(3)
73 0
ASP.NET MVC (五、HttpClient接口解析)(2)
ASP.NET MVC (五、HttpClient接口解析)(2)
75 0
ASP.NET MVC (五、HttpClient接口解析)(1)
ASP.NET MVC (五、HttpClient接口解析)(1)
49 0
ASP.NET MVC (四、ASP.NET Web API应用程序与跨域操作)(7)
ASP.NET MVC (四、ASP.NET Web API应用程序与跨域操作)(7)
64 0
ASP.NET MVC (四、ASP.NET Web API应用程序与跨域操作)(6)
ASP.NET MVC (四、ASP.NET Web API应用程序与跨域操作)(6)
54 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载