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



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

相关文章
|
28天前
|
开发框架 安全 .NET
【Azure Developer】.NET Aspire 项目本地调试遇 Grpc.Core.RpcException 异常( Error starting gRPC call ... )
Error starting gRPC call. HttpRequestException: The SSL connection could not be established, see inner exception. AuthenticationException: The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot
44 12
|
2月前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
60 5
|
1月前
|
开发框架 前端开发 .NET
一个适用于 .NET 的开源整洁架构项目模板
一个适用于 .NET 的开源整洁架构项目模板
57 26
|
2月前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
85 12
|
2月前
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
62 1
|
3月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
64 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
2月前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
57 3
|
3月前
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
55 3
|
5月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
69 7
|
5月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
113 0

热门文章

最新文章