配置功能是软件必要的功能,下面介绍以下 Glacier 内置的配置框架,Glacier 支持三种方式的配置:

  • appSettings 配置
  • 嵌入的 HOCON 配置
  • 独立的 HOCON 配置

优先级:独立的 HOCON 配置 > 嵌入的 HOCON 配置 > appSettings 配置

优先级高的配置会覆盖优先级低的配置

关于 Glacier 框架使用,请前往:https://www.gkarch.com/

1 appSetting 配置

例如在 appSetting 中存在以下配置

<configuration>
<appSettings>
<add key="prefix:key1" value="" />
<add key="prefix:key2" value="foo,bar" />
<add key="prefix:key3:innerKey" value="hello world" />
</appSettings>
</configuration>

通过 Glacier 框架,可以通过使用如下代码来获取配置(可以直接通过 As.. 转换成具体的类型)

// 程序启动时,添加需要加载的配置前缀:
GlacierSystem.Core.AddAppSettingsConfig("prefix"); // 需要获取配置时:
var config = GlacierSystem.Core.GetConfig("prefix");
var val1 = config["key1"].AsInt();
var val2 = config["key2"].AsList<string>(); var innerVal = config["key3:innerKey"].AsString();
// 或
var innerVal = config.GetSub("key3")["innerKey"].AsString();

2 嵌入的 HOCON 配置

HOCON 方式的配置支持类型绑定功能,可以直接将配置绑定到具体的类,使配置更具可读性,方便使用和管理。

依然利用之前的例子,这次使用嵌入的 HOCON 配置

<configuration>
<configSections>
<section name="glacier"
type="GKarch.Glacier.Configuration.HoconSection, GKarch.Glacier" />
</configSections>
<glacier>
<![CDATA[
prefix {
key1 =
key2 = [foo, bar]
key3 = {
innerKey = "hello world"
}
}
]]>
</glacier>
</configuration>

定义一个类来对应这个配置:

// 自定义模型
class MyConfig
{
public int Key1 { get; set; }
public IList<string> Key2 { get; set; }
public IDictionary<string, string> Key3 { get; set; }
}

读取配置并绑定到模型

// 获取配置并绑定到自定义模型
MyConfig config = GlacierSystem.Core.GetConfig("prefix").Bind<MyConfig>;

3 独立的 HOCON 配置

HOCON 配置可以是独立的配置文件,通过独立的配置文件可以更方便的进行开发环境和生产环境的切换,

首先在 appSetting 中定义配置文件

<configuration>
<appSettings>
<add key="glacier:config:provider" value="hocon" />
<!-- 默认加载 config.conf 文件,需要使用其他文件名可添加如下配置 -->
<!-- <add key="glacier:config:hocon:file" value="my.conf" /> -->
</appSettings>
</configuration>

config.conf 配置文件内容

prefix {
key1 =
key2 = [foo, bar]
key3 = {
innerKey = "hello world"
}
}

这次使用一个嵌套的类型来对应配置,定义如下两个类来对应配置

class MyConfig
{
public int Key1 { get; set; }
public IList<string> Key2 { get; set; }
public MyInnerConfig Key3 { get; set; }
} class MyInnerConfig
{
public string InnerKey { get; set; }
}

读取配置

var config = GlacierSystem.Core.GetConfig("prefix").Bind<MyConfig>();
Console.WriteLine(config.Key3.InnerKey); // hello world

C# 中的应用配置的更多相关文章

  1. WCF学习之旅—WCF4.0中的简化配置功能(十五)

    六 WCF4.0中的简化配置功能 WCF4.0为了简化服务配置,提供了默认的终结点.绑定和服务行为.也就是说,在开发WCF服务程序的时候,即使我们不提供显示的 服务终结点,WCF框架也能为我们的服务提 ...

  2. asp.net中web.config配置节点大全详解

    最近网上找了一些关于Web.config配置节点的文章,发现很多都写的都比较零散,而且很少有说明各个配置节点的作用和用法.搜索了一下发现有一篇写的不错,这里引用一下 原文地址 http://www.c ...

  3. CentOS-7.0.中安装与配置Tomcat-7的方法

    安装说明 安装环境:CentOS-7.0.1406安装方式:源码安装 软件:apache-tomcat-7.0.29.tar.gz 下载地址:http://tomcat.apache.org/down ...

  4. 在Web.config或App.config中的添加自定义配置

    .Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持.最近看到一些项目中还在自定义xml文件做程序的配置,所以忍 ...

  5. IIS7错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault="Deny")......

    不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况.锁定是默认设置的(overrideModeDefault="Deny")...... 解决方案: 因为 II ...

  6. 深入理解php中的ini配置(1)

    这篇文章不会详细叙述某个ini配置项的用途,这些在手册上已经讲解的面面俱到.我只是想从某个特定的角度去挖掘php的实现机制,会涉及到一些php内核方面的知识:-) 使用php的同学都知道php.ini ...

  7. IIS关于“ 配置错误 不能在此路径中使用此配置节”的解决办法

    IIS关于“ 配置错误 不能在此路径中使用此配置节”的解决办法 原文链接:http://www.cnblogs.com/200325074/p/3679316.html 今天刚安装好IIS8.5, 我 ...

  8. [转]通过继承ConfigurationSection,在web.config中增加自定义配置

    本文转自:http://www.blue1000.com/bkhtml/2008-02/55810.htm 前几天写了一篇使用IConfigurationSectionHandler在web.conf ...

  9. Win7旗舰版中的IIS配置asp.net的运行环境

    Win7旗舰版中的IIS配置asp.net的运行环境   以前弄过好多次,都没有成功,昨天晚上不知怎么地就成功了,借用我同学的一句话,这叫“灵光一闪”,废话不多说了,这个成功是有图有视频有真相地哈! ...

  10. 安装SQLServer2005错误无法在com+目录中安装和配置程序集

    无法在com+目录中安装和配置程序集c:\program files\Microsoft SQL Server\90\DTS\tasks\microsoft.sqlserver.MSMQTASK.DL ...

随机推荐

  1. MySql 定时完成备份

    <?php /*定时备份数据库文件*/ //设置时区 date_default_timezone_set('PRC'); //创建目录 $dirname = 'e:/mysql_dump/'.d ...

  2. Skills CodeForces - 614D (贪心)

    链接 大意: $n$门课, 第$i$门分数$a_i$, 可以增加共$m$分, 求$cnt_{mx}*cf+mi*cm$的最大值 $cnt_{mx}$为满分的科目数, $mi$为最低分, $cf$, $ ...

  3. 『Numpy』高级函数_np.nditer()&ufunc运算

    1.np.nditer():numpy迭代器 默认情况下,nditer将视待迭代遍历的数组为只读对象(read-only),为了在遍历数组的同时,实现对数组元素值得修改,必须指定op_flags=[' ...

  4. NOJ-1581 筷子 (线性DP)

    题目大意:有n支筷子,已知长度,定义一双筷子的质量等于长度的平方差,问能否分成k双?若能,输出所有筷子的最小质量和. 题目分析:先将筷子按长度从小到大排序,定义状态dp(i,j)表示将前 i 支筷子分 ...

  5. OAF日志使用总结

    本文的完成感谢葛严大神授权使用LogUtil类,其次感谢Tavor大神的EBS OAF开发日志(见: EBS OAF开发中日志(Logging) ). 日志的使用是一门极大的学问,若读者有兴趣,可以自 ...

  6. POJ 1442 splay

    前几天用treap写了这一题,不过treap支持的操作不如splay的多,作为一个完美主义者,重新用splay写了这一题. splay大部分操作可以通过 强大到无与伦比的数据结构splay-tree  ...

  7. 使用路径arc-奥运五环

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>    < ...

  8. PHP header函数设置http报文头示例详解

    //定义编码 header( 'Content-Type:text/html;charset=utf-8 '); //Atom header('Content-type: application/at ...

  9. ShardedJedis的分片原理

    ShardedJedisPool xml配置: <bean id="shardedJedisPool" class="redis.clients.jedis.Sha ...

  10. win7 安装express

    1.以管理员身份打开cmd(避免出错) npm install -g express-generator@4 Start the server: npm start 链接,github官网说明 htt ...