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





5.00/5 (3投票s)
一个简单且可扩展的 .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 日