DotNetCore跨平台~在appsettings.json里自定义配置项

回到目录

DotNetCore里一切都是依赖注入的,对于appsettings这个可扩展的配置对象也不例外,它位于项目根目录,一般在startup里去注册它,在类中通过构造方法注入来获取当前的对象,以便去使用它,当然我们也可以自己去构建和使用它,下面我就来总结一下。

传统方法,startup注入,构造方法使用

1 注意配置类

复制代码
   public class RedisConfiguration
    {
        #region 属性成员

        /// <summary>
        /// 文件上传路径
        /// </summary>
        public string Host { get; set; }

        /// <summary>
        /// 允许上传的文件格式
        /// </summary>
        public string Password { get; set; }
        /// <summary>
        /// 图片上传最大值KB
        /// </summary>
        public int IsProxy { get; set; }
        #endregion
    }
复制代码

2 在appsettings里添加它的内容

复制代码
{
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Warning"
      }
    }
  },

  "RedisConfiguration": {
    "Host": "localhost:6379",
    "Password": "bobo123#",
    "IsProxy": "0"
  }
}
复制代码

3 在控制器里使用它,当然你可以在基类中定义它的使用方式,但注入的入口还是在构造方法上

  public class ApiControllerBase : Controller
    {
        private readonly IOptions<RedisConfiguration> AppConfiguration;
        public ApiControllerBase(IOptions<RedisConfiguration> appConfiguration)
        {
            AppConfiguration = appConfiguration;
        }
   }

这时,你的AppConfiguration在被加载后,就有值了,是在程序运行时被注入进来的!

属性中注入并且使用

appsetting的内容不变,只是在属性中去封装了配置注入与获取的过程,注意,为了考虑性能,你可以把它的建立和获取做成单例,这点我就不设计了!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public RedisConfiguration AppConfigurations
 {
     get
     {
         var config = new ConfigurationBuilder()
                      .AddInMemoryCollection()
                      .SetBasePath(Directory.GetCurrentDirectory())
                      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                      .Build();
 
         var sp = new ServiceCollection().AddOptions().Configure<RedisConfiguration>(
                  config.GetSection("RedisConfiguration")).BuildServiceProvider();
         var _appConfiguration = sp.GetService<IOptions<RedisConfiguration>>();
         return _appConfiguration.Value;
     }
 }

 在控制器上,可以直接使用它了,我这个属性是做在所有控制器的父类上的。

复制代码
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] {
                AppConfigurations.Host,
                AppConfigurations.Password,
                AppConfigurations.IsProxy.ToString()
            };
        }
复制代码

感谢各位的阅读!

对于.net core的研究我们还在继续,希望core2.0,standard2.0不会让我们失望!

听说它已经实现了.net frameworks 4.6.1所有的功能!

回到目录

posted @   张占岭  阅读(3078)  评论(2编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2016-08-17 关于Lind.DDD.Api客户端的使用与知识分享
2012-08-17 DDD领域驱动设计(Domain Driven Design)(转)
2012-08-17 分布式中的DTO(转)
2011-08-17 如何把枚举元素的描述输出(不使用反映和扩展方法(3.5才支持呢)
点击右上角即可分享
微信分享提示