65.9K
CodeProject 正在变化。 阅读更多。
Home

Qonfig 入门 - C# 的简单配置框架

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2013年11月7日

CPOL

3分钟阅读

viewsIcon

14357

一个简单且可扩展的 .NET4 配置框架

背景

配置。很难找到一个简单、应用范围的解决方案,可以在应用程序上下文的不同项目中使用。

我一直在寻找一个:

  • 极其轻量级
  • 初始化一次,在整个应用程序中使用
  • 非常简单易用
  • 可扩展(注册表存储、.ini 等)
  • 特定或动态名称

结果就是 Qonfig 框架。目前只支持注册表作为存储,但其他目标可能很快就会跟进。无论如何,您可以随时扩展它。

引言

让我们看看为您的应用程序创建配置上下文是多么容易。

具体的 (Specific)

public enum ConfigOption
{
    [ConfigurationOption("App:Style", "nice-style")]
    AppStyle
}
class Program
{
    public void Main()
    {
        Configurator.Init<ConfigOption>("Company:Product", typeof(RegistryAdapter));
        ConfigOption.AppStyle.GetConfigurationValue<string>();
        ConfigOption.AppStyle.SetConfigurationValue("nicer-style");
    }
}        

那么,这里发生了什么?首先,我们定义配置模型。看看ConfigOption枚举。它包含一个选项,用一个特殊的属性装饰,该属性定义了路径和名称(使用 ':'、'/' 或 '\' 分隔)以及默认值。

然后,我们执行 Main 函数。首先是初始化静态Configurator类。因为我们想使用特定的配置选项,所以我们将ConfigOption枚举类型作为<T>传递,并将配置存储路径(同样,选择分隔符)作为字符串传递。可以选择设置适配器类型或获取默认适配器(RegistryAdapter)。

这将在您的注册表中创建一个条目,位于“LocalMachine 或 CurrentUser\Software\Company\Product\App”下,名为“Style”,值为空。

你可能会问为什么值为空?答案是,如果它是默认值,为什么要存储它?这样,如果您决定更改默认值,则在之前执行过旧代码的机器上会安全地忽略旧的默认值。你可能会问为什么创建它?为了让用户知道可以设置哪些选项!

使用 LocalMachine 还是 CurrentUser 由应用程序根据其权限决定。可以通过在构造函数中将 forceLocalStorage 设置为 true 来自定义此行为。

Configurator.Init<ConfigOption>("Company:Product", typeof(RegistryAdapter), true); 

接下来,使用枚举扩展GetConfigurationValue<T>SetConfigurationValue来获取特定类型的的值或设置它。

这就是库的显式用法的全部内容。让我们继续进行动态用法吧!

动态

class Program
{
    public void Main()
    {
        Configurator.Init("Company:Product");
        Configurator.Library.Add("App:Style", "nice-style");
        Configurator.Get<string>("App:Style");
        Configurator.Set("App:Style", "nicer-style");
    }
}    

好的,使用存储路径初始化Configurator,并根据需要动态地向库中添加尽可能多的配置项。定义路径和名称以及默认值(如果需要)。

非默认值

如果您不想要这些默认值怎么办?您希望能够添加选项而不指定任何值?很简单,只需设置属性的类型或动态添加没有任何指定内容(除了路径/名称)的选项。

public enum ConfigOption
{
    [ConfigurationOption("Application:Style", typeof(string))]
    AppStyle
} 
Configurator.Library.Add("App:Style");     

非持久性

您想使用任何用户都不能修改的配置选项吗?继续,定义 NonPersistent 属性并为其赋值 'true'!或者,如果您使用的是动态方式,则可以使用 Library.AddNonPersistent 方法添加选项。

public enum ConfigOption
{
    [ConfigurationOption("Application:Style", typeof(string), NonPersistent = true)]
    AppStyle
}    
Configurator.Library.AddNonPersistent("App:Style", "nice-style");    

就是这样,简单易用的持久性控制!

存储

选择总是好的,那么我该如何存储我的数据呢?只需指定一个适配器或编写您自己的适配器(只需实现抽象ConfigurationAdapter类即可)!

Configurator.Init<ConfigOption>("Company:Product", typeof(RegistryAdapter)); 

如前所述,您可以通过在构造函数中指定 'true' 来强制使用本地存储。想象一下始终使用 LocalAppData(文件存储)或注册表中的 CurrentUser。

好了……这就是第一部分的内容。我将尽快尝试创建一个更详细的幕后查看。在此之前,请查看源代码!它已被完整且仔细地注释。

接下来,我将尝试添加文件存储和具有优先级的多个目标支持。 

给我留言吧!

源代码托管在 bitbucket 上,因为 CodeProject 上的上传功能不断返回“上传过程中发生意外错误”。也许我们很快就能解决这个问题。

历史 

  • 修订版 1(初始版),2013 年 11 月 7 日
© . All rights reserved.