一、介绍

    微软已经对外提供了新的平台,我们叫它们是 Net Core 平台,这个平台和 Net Framework 平台有本质的区别,这个最本质的区别就是微软的C#代码可以跨平台了。当前我们主流的3大平台 Net Core 都支持的挺好的,比如:Windows、Linux和Mac。当然编程的体验和方式也发生了很大的不同了。我们以前使用的 Net Framework 平台就是一个大而全的平台,类似全家桶,使用很方便,但是也很笨重。但是 Net Core 平台就采用了“按需索取”的最小设计原则,搭建框架和设计系统,如果我们需要其他类库可以通过 Nuget 获取。

    今天,我们也不会聊太多的东西,抛砖引玉,说说如何在 NetCore 里面如何自定义基于 json 配置文件的管理器的,编程体验还是有不小差异的。

二、编码实现

    今天我们在类库里面定义一个可以访问基于 JSON 的配置文件的配置文件管理器对象。当然这个类库是也是可以跨平台的,当前版本是 Net 5.0。

    1、在开始我们的编码之前,我们先要进入必要的类库。

      Microsoft.Extensions.Configuration.Abstractions

      Microsoft.Extensions.Configuration.FileExtensions

      Microsoft.Extensions.Configuration.Json

    2、编写我们自定义的配置文件管理器。

      我们这个类型可以配置默认配置文件,myconfiguration.json,也可以自己增加的配置文件,覆盖默认的配置文件。

      代码很简单,没有什么可以多说了。

      

  1 using Microsoft.Extensions.Configuration;
2 using System.IO;
3
4 namespace PatrickLiu.NetCore50.IOCFramework
5 {
6 /// <summary>
7 /// 该类型定义了自己定义配置文件的配置管理器。
8 /// </summary>
9 public sealed class CustomConfigurationManager
10 {
11 #region 私有字段
12
13 private IConfigurationRoot _configurationRoot;
14 private string _configuration;
15
16 #endregion
17
18 #region 静态字段
19
20 private static CustomConfigurationManager _instance;
21 private static readonly object lockObj = new object();
22
23 #endregion
24
25 #region 构造函数
26
27 /// <summary>
28 /// 类型构造函数,用于初始化配置跟对象和配置对象的生成器。
29 /// </summary>
30 private CustomConfigurationManager()
31 {
32 JsonConfigurationFile = "myconfiguration.json";
33 Init();
34 }
35
36 #endregion
37
38 #region 公用私有方法
39
40 /// <summary>
41 /// 初始化配置文件信息。
42 /// </summary>
43 private void Init()
44 {
45 var builder = new ConfigurationBuilder()
46 .SetBasePath(Directory.GetCurrentDirectory())
47 .AddJsonFile(JsonConfigurationFile);
48
49 _configurationRoot = builder.Build();
50 }
51
52 #endregion
53
54 #region 对外的访问接口
55
56 /// <summary>
57 /// 获取 CustomConfigurationManager 类型的单件实例。
58 /// </summary>
59 public static CustomConfigurationManager Current
60 {
61 get
62 {
63 if (_instance == null)
64 {
65 lock (lockObj)
66 {
67 if (_instance == null)
68 {
69 _instance = new CustomConfigurationManager();
70 }
71 }
72 }
73 return _instance;
74 }
75 }
76
77 /// <summary>
78 /// 获取或者设置 json 的配置文件。
79 /// </summary>
80 public string JsonConfigurationFile
81 {
82 get { return _configuration; }
83 set
84 {
85 if (!string.IsNullOrEmpty(value) && !string.IsNullOrWhiteSpace(value))
86 {
87 _configuration = value;
88 Init();
89 }
90 }
91 }
92
93 /// <summary>
94 /// 获取指定名称节点的配置数据。
95 /// </summary>
96 /// <param name="nodeName">配置节点的名称。</param>
97 /// <returns></returns>
98 public string GetNode(string nodeName)
99 {
100 if (string.IsNullOrEmpty(nodeName) || string.IsNullOrWhiteSpace(nodeName))
101 {
102 return null;
103 }
104 return _configurationRoot[nodeName];
105 }
106
107 #endregion
108 }
109 }

    3、测试方法,我建立了两个文件,配置文件的名称分别是:myconfiguration.json,myconfiguration2.json

      配置文件的内容很简单,分别如下:
      myconfiguration.json      

{
"IServiceA": "PatrickLiu.NetCore50.IOCServiceses.MyServiceB,PatrickLiu.NetCore50.IOCServiceses"
}

      myconfiguration2.json

1 {
2 "IServiceA2": "PatrickLiu.NetCore50.IOCServiceses.MyServiceB,PatrickLiu.NetCore50.IOCServiceses00000000"
3 }

      

1             {
2 var config=CustomConfigurationManager.Current.GetNode("IServiceA");
3 CustomConfigurationManager.Current.JsonConfigurationFile = "myconfiguration2.json";
4 config = CustomConfigurationManager.Current.GetNode("IServiceA2");
5
6 }

三、总结。

    这个也没有什么难度,只是简单说明一下,NetCore 下编码还是有很大的差别的,配置文件的访问也是不同的,应用的类库也是不同的,作为自己的日志吧。也许时间长了,自己忘却了,可以来这里看看。不忘初心,继续努力。

如何在 NetCore 中定义我们自己的JSON配置文件的管理器。的更多相关文章

  1. 如何在WPF中定义窗体模板

    参考网址:https://www.cnblogs.com/chenxizhang/archive/2010/01/10/1643676.html可以在app.xaml中定义一个ControlTempl ...

  2. 无法将从VSS中的解决方案添加到TFS的源代码管理器中

    VSS是一种非常有用的项目文件管理工具,百度百科的解释是:VSS 的全称为 Visual Source Safe .作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责 ...

  3. TFS 中如何将项目加入已有的源代码管理器中?

    Visual Studio 的某解决方案已经加入 Team Foundation Server,现在再将已经存在的项目加入到解决方案中,可是签入时,并没有把新加入的项目签入,怎么办呢? 在团队资源管理 ...

  4. 如何在Java中定义常量(Constant)

    原本引自  http://blog.csdn.net/autofei/article/details/6419460 /** * Method One */ interface ConstantInt ...

  5. 如何在C中定义多行宏定义?

    请参阅下面的示例,其中我将交换两个变量的值. do-while(0)结构很不错 #include <stdio.h> #define swap(x,y,T) do { \ T temp = ...

  6. 在netcore中如何注入同一个接口的多个实现

    netcore中自带了Ioc框架,这也影响了我们的编码习惯,以前都是静态类或者直接new对象,现在有了Ioc框架的支持,我们也不必守旧,应当使用起来,接受这种对象管理方式.使用过java的同仁,都习惯 ...

  7. JavaScript中定义类的方式详解

    本文实例讲述了JavaScript中定义类的方式.分享给大家供大家参考,具体如下: Javascript本身并不支持面向对象,它没有访问控制符,它没有定义类的关键字class,它没有支持继承的exte ...

  8. 如何在VS2015中使用Git命令提示符

    本文转载自 http://qkxue.net/info/176223/Visual-Studio-Git VS2015自带了Git插件,但有时候觉得Git控制台命令更方便些.VS中本身不能把Git B ...

  9. PHP V5.2 中的新增功能,第 1 部分: 使用新的内存管理器

    PHP V5.2:开始 2006 年 11 月发布了 PHP V5.2,它包括许多新增功能和错误修正.它废止了 5.1 版并被推荐给所有 PHP V5 用户进行升级.我最喜欢的实验室环境 —— Win ...

随机推荐

  1. Flask一分钟Mock一个API

    如果安装了Python,并且安装了Flask: pip install flask 那么就可以在短短一分钟内Mock出来一个API,而且只需要用到一个文件. 彻底告别在线Mock网站无法指定请求方法, ...

  2. Spring Boot下的一种导入Excel文件的代码框架

    1.前言 ​ Spring Boot下如果只是导入一个简单的Excel文件,是容易的.网上类似的文章不少,有的针对具体的实体类,代码可重用性不高:有的利用反射机制或自定义注解,开发了Excel导入工具 ...

  3. excel自动记录项目完成进度,是否逾期,逾期/提前完成天数,计算天数可以把now()改为today()

    =IF(D38="",NOW()-C38,F38) 注:如果没有启用迭代计算,可以点击"文件"-"选项"-"公式"-&q ...

  4. Gym 100283F Bakkar In The Army

    数学公式: n^2的前n项和n(n+1)(2*n+1)/6,用二分进行查找: 算出层数后继续二分查找位于这一层的哪一位,也可以推出相应公式 #include <iostream> #inc ...

  5. JUnit5的Tag、Filter、Order、Lifecycle

    Tag JUnit5可以使用@Tag注解给测试类和测试方法打tag,这些tag能用来在执行时进行过滤,它跟group有点类似. tag应该遵循以下规则: 不能为null或者为空. 不能包含空格. 不能 ...

  6. 我是如何用redis做实时订阅推送的(转)

    前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的.       先说一下领劵中心的项目吧,这个项目就类似京东app的领劵中心,当然图是截取京东的,公司的就不截了...   其中 ...

  7. OSI与TCP/IP各层的结构与功能,都有哪些协议?

    学习计算机⽹络时我们⼀般采⽤折中的办法,也就是中和 OSI 和 TCP/IP 的优点,采⽤⼀种只有 五层协议的体系结构,这样既简洁⼜能将概念阐述清楚. 结合互联⽹的情况,⾃上⽽下地,⾮常简要的介绍⼀下 ...

  8. 二进制方式搭建Kubernetes集群

    环境准备: 演练暂时用单节点一台master和一台node节点来进行部署搭建(kubernetes 1.19版本) 角色 IP 组件 master 10.129.246.114 kube-apiser ...

  9. 做词云时报错cannot import name ‘WordCloud‘ from partially initialized module ‘wordcloud‘的解决办法

    问题: 在做词云时,运行时出现该问题,wordcloud安装成功,但运行出错,错误提示是:cannot import name 'WordCloud' from partially initializ ...

  10. final修饰符(5)-final方法

    final修饰的类的方法不能被重写,例如如果父类不希望子类重写某个方法,则可以使用final修饰符修饰该方法 在java的Object类里面有一个final方法:getClass(),因为Java不希 ...