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

Cinchoo - 简化的配置管理器

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2012年12月20日

CPOL

13分钟阅读

viewsIcon

37227

downloadIcon

452

.NET 中的简易配置管理

目录

1. 引言

Cinchoo 是 .NET 的应用程序框架。它为用户提供的核心功能之一就是应用程序配置管理。应用程序配置是指应用程序在运行时从源读取和/或写入的信息。

Cinchoo 框架通过代码更少的方式简化了开发,并无缝地将配置值读写到底层数据源。此外,它还为您提供了通过配置灵活地更换配置源而无需任何代码更改的灵活性。

Cinchoo 配置框架具有以下强大功能:

  • 单一 API 处理多源配置数据
  • 双向、类型安全的配置管理
  • 如果配置丢失,则创建配置文件
  • 如果配置节不存在,则生成配置节
  • 在应用程序运行时,可以灵活地更换配置源,而无需任何重启或停机
  • 自动更正配置节中缺失的条目

2. 要求

此配置库是用 C# 编写的,适用于 .NET 4.0 框架。它是 Cinchoo 框架的一部分,一个功能丰富的 .NET 应用程序框架,提供了配置管理、通用应用程序主机、Shell 功能等。

3. “Hello World!” 示例

让我们先来看一个简单的示例,一个应用程序消耗两个配置值 name messagename 是必需的配置值,msg 是可选的配置值,默认值为 100, Madison Avenue, New York, NY 10010”。 如果 msg 未配置,它将采用默认值。

  • 在此处下载最新的 **Cinchoo** 二进制文件 此处。(Nuget 命令:Install-Package Cinchoo
  • 打开 VS.NET 2010 或更高版本
  • 创建一个示例 VS.NET (.NET Framework 4) 控制台应用程序项目
  • 添加对 Cinchoo.Core.dll 的引用
  • 使用 Cinchoo.Core Cinchoo.Core.Configuration 命名空间
  • 复制并粘贴以下命令行对象

列表 3.1 定义配置对象

[ChoNameValueConfigurationSection("appSettings")]
public class AppSettings : ChoConfigurableObject
{
    [ChoPropertyInfo("name", DefaultValue = "Mark")]
    public string Name;

    [ChoPropertyInfo("address", DefaultValue = "100, Madison Avenue, New York, NY 10010")]
    public string Address;
} 

上面的代码说明了如何定义配置对象。首先,从 ChoConfigurableObject 派生一个配置(例如 AppSettings)类,这表明该对象是配置对象。并且它必须使用可用的配置节属性之一进行装饰,稍后将讨论。在此示例中,我使用了 ChoNameValueConfigurationSectionAttribute ,并将节名称设置为 'appSettings' 来完成定义。它指定此配置节是 NameValueConfigurationSection。通过此定义,我们将上述配置对象转变为从配置节提供名称/值对配置信息。

定义配置值成员 Name Address ,它们可以是 public 字段或具有 get set 的属性。使用 ChoPropertyInfo 属性装饰它们,以表明它们是配置成员。在此示例中,Name 是可选的配置成员。它被赋予 'name' 作为配置成员名称,DefaultValue 'Mark'。这意味着如果配置值在源中缺失,它将默认为 DefaultValue

Address 配置成员也是一个可选成员。它被赋予 'address' 作为名称,DefaultValue '100, Madison Avenue, New York, NY 10010'

一旦按照上述方式定义了配置对象,就可以像构造它的实例一样简单地在应用程序中使用它。下面的示例代码展示了如何使用它。

列表 3.2 Main 方法

static void Main(string[] args)
{
    AppSettings appSettings = new AppSettings();
    Console.WriteLine(appSettings.ToString());

    //Update the name to 'Raj', see it is updating to source
    appSettings.Name = "Raj";

    ChoConsole.PauseLine();
}  

我们首先创建一个 AppSettings 对象的实例。仅此而已。所有将配置值加载到对象中的繁重工作都由框架在后台完成。

现在编译并运行此程序。它将在 bin/Config 文件夹下的 [appExeName].xml (HelloWorld.exe.xml) 文件中创建该节。

列表 3.3 HelloWorld.exe.xml

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="appSettings" type="Cinchoo.Core.Configuration.ChoNameValueSectionHandler, Cinchoo.Core" />
  </configSections>
  <appSettings>
    <add key="name" value="Raj" />
    <add key="address" value="100, Madison Avenue, New York, NY 10010" />
  </appSettings>
</configuration> 

4. 配置节处理器的类型

Cinchoo 框架开箱即用地提供了一些配置节处理器。以下是一些可用的配置节处理器:

  • ChoNameValueConfigurationSection - 从配置节提供名称/值对配置信息。
  • ChoDictionaryConfigurationSection - 从配置节提供键/值对配置信息。
  • ChoSingleTagConfigurationSection - 处理由配置文件的单个 XML 标签表示的配置节。
  • ChoStandardAppSettingsConfigurationSection - 从 <appSettings> 节读取/写入键/值对。
  • ChoIniConfigurationSection - 从 INI 文件读取/写入配置值。
  • ChoRegistryConfigurationSection - 从系统注册表读取/写入配置值。
  • ChoSqlServerConfigurationSection - 从 MS SqlServer 数据库读取/写入配置值。
  • ChoDbGenericKeyValueConfigurationSection - 从任何数据库读取/写入配置值。
  • ChoJSONConfigurationSection - 读取/写入 JSON 格式的配置值。

4.1 ChoNameValueConfigurationSection

它提供了访问配置节中的名称/值对配置信息。它使用 NameValueCollection 作为底层存储,这意味着它存储的值是 string->string 对。如果您需要高效的配置,请使用 ChoDictionaryConfigurationSection 处理器。

下面的示例说明了如何使用此节来定义配置对象以消耗配置值。声明 ChoNameValueConfigurationSectionAttribute 到配置类以使用此节处理器。

列表 4.1.1 定义配置对象

[ChoNameValueConfigurationSection("appSettings")]
public class AppSettings : ChoConfigurableObject
{
    [ChoPropertyInfo("name")]
    public string Name;

    [ChoPropertyInfo("address", DefaultValue = "100, Madison Avenue, New York, NY 10010")]
    public string Address;
} 

实例化对象后,您就可以使用配置值了。下面的文件显示了使用此节处理器时生成的配置文件的布局。

列表 4.1.2 HelloWorld.exe.xml

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="appSettings" type="Cinchoo.Core.Configuration.ChoNameValueSectionHandler, Cinchoo.Core" />
  </configSections>
  <appSettings>
    <add key="name" value="Raj" />
    <add key="address" value="100, Madison Avenue, New York, NY 10010" />
  </appSettings>
</configuration> 

4.2 ChoDictionaryConfigurationSection

它提供了访问配置节中的键/值对配置信息。它与 ChoNameValueConfigurationSection 非常相似,但消耗配置值的效率更高。

下面的示例说明了如何使用此节来定义配置对象以消耗配置值。声明 ChoDictionaryConfigurationSectionAttribute 到配置类以使用此节处理器。

列表 4.2.1 定义配置对象

[ChoDictionaryConfigurationSection("appSettings")]
public class AppSettings : ChoConfigurableObject
{
    [ChoPropertyInfo("name")]
    public string Name;

    [ChoPropertyInfo("address", DefaultValue = "100, Madison Avenue, New York, NY 10010")]
    public string Address;
} 

实例化对象后,您就可以使用配置值了。下面的文件显示了使用此节处理器时生成的配置文件的布局。

列表 4.2.2 HelloWorld.xml

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="appSettings" type="Cinchoo.Core.Configuration.ChoDictionarySectionHandler, Cinchoo.Core" />
  </configSections>
  <appSettings>
    <add key="name" value="Raj" />
    <add key="address" value="100, Madison Avenue, New York, NY 10010" />
  </appSettings>
</configuration> 

4.3 ChoSingleTagConfigurationSection

它处理由配置文件的单个 XML 标签表示的配置节。这是一种非常简单、优雅的方式来在配置文件中获取值。唯一的缺点是它只能在 XML 属性中包含简单值。

下面的示例说明了如何使用此节来定义配置对象以消耗配置值。声明 ChoSingleTagConfigurationSectionAttribute 到类以使用此节处理器。

列表 4.3.1 定义配置对象

[ChoSingleTagConfigurationSection("appSettings")]
public class AppSettings : ChoConfigurableObject
{
    [ChoPropertyInfo("name")]
    public string Name;

    [ChoPropertyInfo("address", DefaultValue = "100, Madison Avenue, New York, NY 10010")]
    public string Address;
} 

实例化对象后,您就可以使用配置值了。下面的文件显示了使用此节处理器时生成的配置文件的布局。

列表 4.3.2 HelloWorld.xml

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="appSettings" type="Cinchoo.Core.Configuration.ChoNameValueSectionHandler, Cinchoo.Core" />
  </configSections>
  <appSettings name="Raj" address="100, Madison Avenue, New York, NY 10010" />
</configuration> 

4.4 ChoIniConfigurationSection

它处理从 INI 文件读取和写入配置值,INI 文件是一种简单的文本文件,基本结构由节、属性和值组成。它仍然受某些遗留平台支持。

列表 4.4.1 示例 INI 文件 (AppSettings.ini)

; last modified 1 April 2001 by John Doe
[APP_SETTINGS]
NAME=John Doe
ADDRESS=Acme Widgets Inc.
 
[DATABASE]
; use IP address in case network name resolution is not working
SERVER=192.0.2.62     
PORT=143
FILE="payroll.dat"

此节处理器通过提供统一的接口简化了 INI 文件值到配置对象的消耗。下面的示例说明了如何使用此节来定义配置对象以消耗 INI 值。声明 ChoIniConfigurationSectionAttribute 到配置类以使用此节处理器。

列表 4.4.2 定义配置对象

[ChoIniConfigurationSection("appSettings", "APP_SETTINGS", "AppSettings.ini")]
public class AppSettings : ChoConfigurableObject
{
    [ChoPropertyInfo("name")]
    public string Name;

    [ChoPropertyInfo("address", DefaultValue = "100, Madison Avenue, New York, NY 10010")]
    public string Address;
} 

上面的代码说明了如何将 INI 配置节指定到配置对象。它指定了将从中读取/写入值的 INI 文件名 (AppSettings.ini)。它可以是绝对或相对文件路径。如果文件名未指定路径,配置管理器将在当前可执行文件夹中查找文件。如果 INI 文件不存在,它将自动创建,包含所有带有默认值的配置成员。

此外,您还需要指定 INI 节 ('APP_SETTINGS') 名称,所有配置成员值都将从中加载。

实例化对象后,您就可以使用配置值了。控件值保存在配置文件中,供您以后进行调整。

列表 4.4.3 HelloWorld.xml

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="appSettings" 
    type="Cinchoo.Core.Configuration.ChoNameValueSectionHandler, Cinchoo.Core" />
  </configSections>
  <appSettings cinchoo:iniSectionName="APP_SETTINGS" cinchoo:iniFilePath="AppSettings.ini" xmlns:cinchoo="http://schemas.cinchoo.com/cinchoo/01/framework" />
</configuration>

动态/运行时设置

Cinchoo 提供了一种在运行时设置 ini 文件的方法,以防 ini 文件是在执行期间动态确定的,例如通过命令行参数等。

下面的示例展示了如何实现这一点

[ChoIniConfigurationSection("appIniSettings", "SAMPLE", "Test.ini")]
public class AppSettingsIni : ChoConfigurableObject
{
    [ChoPropertyInfo("name")]
    public string Name;

    [ChoPropertyInfo("address")]
    public string Address;

    protected override void OnAfterConfigurationObjectLoaded()
    {
        Console.WriteLine(ToString());
    }

    protected override void OverrideMetaDataInfo(ChoBaseConfigurationMetaDataInfo metaDataInfo)
    {
        ChoIniConfigurationMetaDataInfo mi = metaDataInfo as ChoIniConfigurationMetaDataInfo;
        mi.IniFilePath = "TestOverride.ini";
        base.OverrideMetaDataInfo(metaDataInfo);
    }
}

只需覆盖 'OverrideMetaDataInfo' 方法,并在运行时发送 ini 文件路径即可加载它。

4.5 ChoRegistryConfigurationSection

它处理从系统注册表读取和写入配置值,这是一个 分层 数据库,用于存储 Microsoft Windows 操作系统上的配置设置和选项。

列表 4.5.1 示例注册表映像 (HelloWorld)

此节通过提供统一的接口简化了注册表信息到配置对象的消耗。下面的示例说明了如何定义和使用此节来消耗注册表值。声明 ChoRegistryConfigurationSectionAttribute 到配置类以使用此节处理器。

列表 4.5.2 定义配置对象

[ChoRegistryConfigurationSection("appSettings", @"HKCU\Software\HelloWorld")]
public class AppSettings : ChoConfigurableObject
{
    [ChoPropertyInfo("name")]
    public string Name;

    [ChoPropertyInfo("address", DefaultValue = "100, Madison Avenue, New York, NY 10010")]
    public string Address;
} 

上面的代码说明了如何将注册表配置节指定到配置对象。它指定了将从中读取/写入所有配置值的注册表项的位置。如果找不到注册表项和子项,框架将自动创建它们。

以下是一些已知的注册表根的快捷名称,在定义此节时可以使用:

  1. HKCU - HKEY_CURRENT_USER
  2. HKLM - HKEY_LOCAL_MACHINE
  3. HKCR - HKEY_CLASSESS_ROOT
  4. HKCC - HKEY_CURRENT_CONFIG

实例化对象后,您就可以使用配置值了。下面的文件显示了保留的控件值,以便以后可以进行修改。

列表 4.5.3 HelloWorld.xml

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="appSettings" type="Cinchoo.Core.Configuration.ChoDictionarySectionHandler, Cinchoo.Core" />
  </configSections>
  <appSettings cinchoo:registryKey="HKCU\Software\HelloWorld" xmlns:cinchoo="http://schemas.cinchoo.com/cinchoo/01/framework" />
</configuration>

动态/运行时设置

Cinchoo 提供了一种在运行时设置 ini 文件的方法,以防 ini 文件是在执行期间动态确定的,例如通过命令行参数等。

下面的示例展示了如何实现这一点

[ChoRegistryConfigurationSection("appSettings", @"HKCU\Software\HelloWorld")]
public class AppSettingsRegistry : ChoConfigurableObject
{
    [ChoPropertyInfo("name")]
    public string Name;
 
    [ChoPropertyInfo("address")]
    public string Address;
 
    protected override void OnAfterConfigurationObjectLoaded()
    {
        Console.WriteLine(ToString());
    }
 
    protected override void OverrideMetaDataInfo(ChoBaseConfigurationMetaDataInfo metaDataInfo)
    {
        ChoRegistryConfigurationMetaDataInfo mi = metaDataInfo as ChoRegistryConfigurationMetaDataInfo;
        mi.RegistryKey = @"HKCU\Software\HelloWorldNew";
        base.OverrideMetaDataInfo(metaDataInfo);
    }
}

只需覆盖 'OverrideMetaDataInfo' 方法,并在运行时发送 ini 文件路径即可加载它。

4.6 ChoSqlServerConfigurationSection

它处理从 Microsoft SqlServer 数据库读取和写入配置值,这是 Microsoft 为企业环境设计的 RDBMS。在桌面环境中广泛使用的常用数据库。

此节处理器允许多个应用程序存储和消耗集中配置值。

首先,您必须按照以下架构在目标数据库中创建一个配置表。

列表 4.6.1 配置表

CREATE TABLE APP_SETTINGS
(
    [KEY] VARCHAR (50) NOT NULL,
    VALUE VARCHAR (100),
    PRIMARY KEY ([KEY])
) 

该表允许为每个配置成员存储键值对。

下面的示例说明了如何定义和使用此节来消耗配置值。声明 ChoSqlServerConfigurationSectionAttribute 到类以使用此节处理器。

列表 4.6.2 定义配置对象

[ChoSqlServerConfigurationSection("appSettings", 
@"Server=SNYC12345400\XYZKND01;Database=TestDb;Trusted_Connection=True;", "APP_SETTINGS")]
public class AppSettings : ChoConfigurableObject
{
    [ChoPropertyInfo("name")]
    public string Name;

    [ChoPropertyInfo("address", DefaultValue = "100, Madison Avenue, New York, NY 10010")]
    public string Address;
} 

上面的代码说明了如何将 sqlserver 配置节指定到 configuration 对象。在这里,我们指定了 configSectionName、数据库连接字符串和表名。TableName 是可选的。如果未指定,框架将尝试在配置节对象名称(AppSettings)的名称中查找表名。

实例化对象后,您就可以使用配置值了。下面的文件显示了使用此节处理器时生成的配置文件的布局。

列表 4.6.3 HelloWorld.xml

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="appSettings" type="Cinchoo.Core.Configuration.ChoDictionarySectionHandler, Cinchoo.Core" />
  </configSections>
  <appSettings cinchoo:configObjectAdapterType="Cinchoo.Core.Configuration.ChoDbGenericKeyValueConfigStorage, Cinchoo.Core" 
    xmlns:cinchoo="http://schemas.cinchoo.com/cinchoo/01/framework">
    <cinchoo:configObjectAdapterParams xmlns:cinchoo="http://schemas.cinchoo.com/cinchoo/01/framework">
      <![CDATA[CONNECTION_STRING='Server=WNPCTDVXYZ01\MSXYZD01;Database=School;
          Trusted_Connection=True;';TABLE_NAME=APP_SETTINGS;PROVIDER_NAMESPACE=System.Data.SqlClient]]>
    </cinchoo:configObjectAdapterParams>
  </appSettings>
</configuration> 

提供了多个 ChoSqlServerConfigurationSectionAttribute 重载以满足不同的要求。其中大多数都是不言自明的。下面提到的一项重要重载现在接受 .NET ConnectionString 名称作为参数。

列表 4.6.4 ChoSqlServerConfigurationSectionAttribute 重载

public ChoSqlServerConfigurationSectionAttribute
    (string configElementPath, string connectionStringOrName, string tableName);

例如,如果您的应用程序已经使用 .NET ConnectionString 进行数据库访问,您可能会在应用程序配置文件中看到以下条目。

列表 4.6.5 App.Config 文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="TESTDB"
            connectionString="Server=SNYC12345400\XYZKND01;Database=TestDb;
        Trusted_Connection=True;" providerName ="System.Data.SqlClient"/>
    </connectionStrings>
</configuration>

此配置节通过接受 .NET ConnectionString 名称作为参数来利用此功能,从而消除了在多个位置维护数据库连接 string 的重复。

下面的代码说明了如何在配置对象中使用上述连接 string 名称。

列表 4.6.6 使用 ConnectionStringName 的配置对象

[ChoSqlServerConfigurationSection("appSettings", @"TESTDB", "APP_SETTINGS")]
public class AppSettings : ChoConfigurableObject
{
    [ChoPropertyInfo("name")]
    public string Name;

    [ChoPropertyInfo("address", DefaultValue = "100, Madison Avenue, New York, NY 10010")]
    public string Address;
}

Cinchoo 框架会自动无缝地从系统 ConnectionStrings 节中发现连接 string ,并使用它们来消耗配置值。

4.7 ChoAnyDbConfigurationSection

它处理从任何数据库读取和写入配置值。您只需要您想使用的数据库的 ADO.NET 驱动程序。此节处理器允许多个应用程序存储和消耗集中配置值。

首先,您必须按照以下架构在目标数据库中创建一个配置表。

列表 4.7.1 配置表

CREATE TABLE APP_SETTINGS
(
    [KEY] VARCHAR (50) NOT NULL,
    VALUE VARCHAR (100),
    PRIMARY KEY ([KEY])
) 

该表允许为每个配置成员存储键值对。

下面的示例说明了如何定义和使用此节来消耗配置值。声明 ChoAnyDbConfigurationSectionAttribute 到类以使用此节处理器。

列表 4.7.2 定义配置对象

[ChoAnyDbConfigurationSection("appSettings", @"Data Source=.\SqliteTest.db;Version=3;
    Pooling=True;Max Pool Size=100;", "APP_SETTINGS", "System.Data.SQLite")]
public class AppSettings : ChoConfigurableObject
{
    [ChoPropertyInfo("name")]
    public string Name;

    [ChoPropertyInfo("address", DefaultValue = "100, Madison Avenue, New York, NY 10010")]
    public string Address;
} 

上面的代码说明了如何将 Sqlite 数据库配置节设置到配置对象。在这里,我们指定了 configSectionName、sqlite 数据库连接字符串、provideName tableName

ProvideName 是数据库 ADO.NET 提供程序名称。此参数是可选的。如果未指定,将使用 'System.Data.SqlClient'。

TableName 是可选的。如果未指定,框架将尝试在配置节对象名称(AppSettings)的名称中查找 tablename

实例化对象后,您就可以使用配置值了。下面的文件显示了使用此节处理器时生成的配置文件的布局。

列表 4.7.3 HelloWorld.xml

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="appSettings" type="Cinchoo.Core.Configuration.ChoDictionarySectionHandler, Cinchoo.Core" />
  </configSections>
  <appSettings cinchoo:configObjectAdapterType=
    "Cinchoo.Core.Configuration.ChoDbGenericKeyValueConfigStorage, Cinchoo.Core" xmlns:cinchoo="http://schemas.cinchoo.com/cinchoo/01/framework">
    <cinchoo:configObjectAdapterParams xmlns:cinchoo="http://schemas.cinchoo.com/cinchoo/01/framework">
    <![CDATA[CONNECTION_STRING='Data Source=.\SqliteTest.db;Version=3;Pooling=True;Max Pool Size=100;';TABLE_NAME=APP_SETTINGS;PROVIDER_NAMESPACE=System.Data.SQLite]]>
    </cinchoo:configObjectAdapterParams>
  </appSettings>
</configuration>

ChoDbAnyConfigurationSectionAttribute 现在通过 connectionStringOrName 接受 .NET ConnectionString 名称作为参数。

例如,如果您的应用程序已经使用 .NET ConnectionString 进行数据库访问,您可能会在应用程序配置文件中看到以下条目。

列表 4.7.5 App.Config 文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="TESTDB"
            connectionString="Server=SNYC12345400\XYZKND01;Database=TestDb;
        Trusted_Connection=True;" providerName ="System.Data.SqlClient"/>
    </connectionStrings>
</configuration>

此配置节通过接受 .NET ConnectionString 名称作为参数来利用此功能,从而消除了在多个位置维护数据库连接字符串的重复。

下面的代码说明了如何在配置对象中使用上述连接字符串名称。

列表 4.7.6 使用 ConnectionStringName 的配置对象

[ChoAnyDbConfigurationSection("appSettings", @"TESTDB", "APP_SETTINGS")]
public class AppSettings : ChoConfigurableObject
{
    [ChoPropertyInfo("name")]
    public string Name;

    [ChoPropertyInfo("address", DefaultValue = "100, Madison Avenue, New York, NY 10010")]
    public string Address;
}

Cinchoo 框架会自动无缝地从系统 ConnectionStrings 节中发现连接字符串和提供程序名称,并使用它们来消耗配置值。

4.8 ChoJSONConfigurationSection

它处理从 JSON 格式文件读取和写入配置值,JSON 是一种简单的、可读的 JavaScript 对象表示法格式,用于构建数据。大多数最新平台都以这种格式消耗数据。

列表 4.8.1 示例 JSON 文件 (AppSettings.json)

{"name":"Mark","address":"10 River Road, NewCity, 08837"}

PS:此节处理器不属于 Cinchoo 框架库。您需要从 nuget 安装插件才能在项目中进行使用。

Install-Package Cinchoo.Core.Configuration.JSON

此节处理器通过提供统一的接口简化了 JSON 文件值到配置对象的消耗。下面的示例说明了如何使用此节来定义配置对象以消耗 JSON 值。声明 ChoJSONConfigurationSectionAttribute 到配置类以使用此节处理器。

列表 4.8.2 定义配置对象

[ChoJSONConfigurationSection("appSettings", ConfigFilePath = "appsettings.json")]
public class AppSettings : ChoConfigurableObject
{
    [ChoPropertyInfo("name")]
    public string Name;

    [ChoPropertyInfo("address", DefaultValue = "100, Madison Avenue, New York, NY 10010")]
    public string Address;
} 

上面的代码说明了如何将 JSON 配置节指定到配置对象。它指定了将从中读取/写入值的 JSON 文件名 (AppSettings.json)。它可以是绝对或相对文件路径。如果文件名未指定路径,配置管理器将在当前可执行文件夹中查找文件。如果 JSON 文件不存在,它将自动创建,包含所有带有默认值的配置成员。

实例化对象后,您就可以使用配置值了。

列表 4.8.3 Main 方法

static void Main(string[] args)
{
    AppSettings applicationSettings = new AppSettings();
    Console.WriteLine(applicationSettings.Name);
    ChoConsole.PauseLine();
} 

动态/运行时设置

Cinchoo 提供了一种在运行时设置 ini 文件的方法,以防 ini 文件是在执行期间动态确定的,例如通过命令行参数等。

下面的示例展示了如何实现这一点

[ChoJSONConfigurationSection("appSettings", ConfigFilePath = "test.json", Silent = false)]
public class AppSettings : ChoConfigurableObject
{
    [ChoPropertyInfo("name", DefaultValue = "Raj")]
    [ChoNotNullOrWhiteSpaceValidator]
    public string Name
    {
        get;
        set;
    }
 
    [ChoPropertyInfo("address", DefaultValue = "10 River Road, 08837")]
    public string Address;
 
    [ChoPropertyInfo("Date", DefaultValue = "%%NOW^MM/dd/yyyy HH:mm:ss%%")]
    public DateTime Date;
 
    protected override void OnAfterConfigurationObjectLoaded()
    {
        Console.WriteLine(ToString());
    }
 
    protected override void OverrideMetaDataInfo(ChoBaseConfigurationMetaDataInfo metaDataInfo)
    {
        ChoStandardConfigurationMetaDataInfo mi = metaDataInfo as ChoStandardConfigurationMetaDataInfo;
        mi.ConfigFilePath = "test12.json";
        base.OverrideMetaDataInfo(metaDataInfo);
    }
}

使用 **Cinchoo** 框架处理配置非常简单。自己尝试一下。谢谢。

© . All rights reserved.