ホームページ  >  記事  >  バックエンド開発  >  .NetCore が Json および Xml 形式で構成情報を取得する方法の説明

.NetCore が Json および Xml 形式で構成情報を取得する方法の説明

巴扎黑
巴扎黑オリジナル
2017-09-20 09:36:003712ブラウズ

この記事では、Json で構成情報を取得する方法と見てみましょう

この記事で共有するのは、Json で構成情報を取得する方法と情報ですので、コンソール アプリケーションにテスト ポイントを配置しますnetcore のコンソールで設定ファイルを使用することも一般的であり、公式 Web サイトの例では主に json 形式について説明しており、xml 形式についても直接説明しています。この記事を共有することで役立つことを願っています。あなた;

  1. Json 設定情報を取得します

  2. XML 設定情報を取得します

  3. 設定ファイルをアプリケーションから分離できますか? 答えは「はい」です

  4. netcore の netstandard 拡張機能には、設定ファイル情報操作クラスが付属しています。core の Web アプリケーションとコンソール アプリケーションが統合されているため、以下のテスト ケースはコンソール アプリケーションで示されていますが、Web にも使用できます。アプリケーション;

まず、コンソール アプリケーションで次の nuget パッケージを参照する必要があります (ここでのテストは 2.0 に基づいています):

 Install-Package Microsoft.Extensions.Configuration -Version 2.0.0 
 Install-Package Microsoft.Extensions.Configuration.Abstractions -Version 2.0.0

Json 構成情報を取得します

json 構成を取得するには、上記の 2 つの参照に加えて、次の引用も必要です:

 Install-Package Microsoft.Extensions.Configuration.Json -Version 2.0.0

これは、コンソール アプリケーションで appsettings.json ファイルを作成し、次の json 構成ファイル情報を定義します。


{
 "MyConfig": {
 "UserName": "神牛步行3",
 "userPwd": "666666",
 "GaoDeApi": {
  "UserName": "神牛步行1",
  "userPwd": "111111"
 },
 "BaiDuApi":{
  "userName": "神牛步行2",
  "userPwd": "222222"
 }
 }
}

次に、ファイル情報を取得するには、次のコードのみが必要です:


var configBasePath = Directory.GetCurrentDirectory(); //configBasePath = @"D:\D\TTest";
sbLog.Append($"配置文件所在目录:{configBasePath}\n");
var builder = new ConfigurationBuilder().
     SetBasePath(configBasePath).
     AddJsonFile("appsettings.json");
var config = builder.Build();
sbLog.Append($"MyConfig:UserName节点的值:{config.GetSection("MyConfig:UserName").Value}");

すでにコア開発の経験がある友人にとっては、上記は直接理解できますが、完全な説明のために、まだ簡単に説明する必要があります:


ConfigurationBuilder インスタンスの後、SetBasePath メソッドを使用して構成ファイルのベース パスを設定し、AddJsonFile 拡張メソッドを使用して読み取られるファイル名を指定する必要があります。これらの手順は IConfigurationBuilder を返します。このビルダーは、start の意味と少し似ています:

明らかに、MyConfig:UserName ノードの値です。ここでは、構成ノードは IConfigurationSection GetSection(string key); 関数によって取得され、ノード レベルは「:」によってリンクされているため、ここでは key=MyConfig:UserName になります。

プログラムの美しさと多用途性のために、json ファイルのカプセル化を次のように示します:

/// <summary>
/// json配置文件读取
/// </summary>
/// <param name="configFileName"></param>
/// <param name="basePath"></param>
/// <returns></returns>
public static IConfigurationRoot GetJsonConfig(
   string configFileName = "appsettings.json",
   string basePath = "")
{
  basePath = string.IsNullOrWhiteSpace(basePath) ? Directory.GetCurrentDirectory() : basePath;
  var builder = new ConfigurationBuilder().
    SetBasePath(basePath).
    AddJsonFile(configFileName);
  return builder.Build();
}

ここです。AddJsonFile メソッドは、冒頭で参照した Microsoft.Extensions.Configuration.Json を通じて拡張されていることに注意してください。 IConfiguration は GetSection 関数を使用するだけでなく、この [文字列キー] メソッドに従ってノードを取得することもできるため、次のようにノード情報を構成するためのコードとレンダリングを取得します。
var configJson = GetJsonConfig();
sbLog.Append($"json配置-MyConfg节点的值:\n");
sbLog.Append($"高德-UserName:{configJson.GetSection("MyConfig:GaoDeApi:UserName").Value}\n");
sbLog.Append($"百度-userName:{configJson["MyConfig:BaiDuApi:UserName"]}\n\r\n");


注: ノードは大文字と小文字を区別しません。マルチレベル ノードは ':' を使用して取得します。


xml 構成情報を取得することも、拡張版では一般的です。 IConfigurationBuilder には、json に似た拡張メソッドもあります。まず、次のパッケージを参照する必要があります:

 Install-Package Microsoft.Extensions.Configuration.Xml -Version 2.0.0

次に、json とほぼ同じコードを使用して XML 構成ファイルを取得します:

/// <summary>
/// xml配置文件读取
/// </summary>
/// <param name="configFileName"></param>
/// <param name="basePath"></param>
/// <returns></returns>
public static IConfigurationRoot GetXmlConfig(
   string configFileName = "appsettings.xml",
   string basePath = "")
{
   basePath = string.IsNullOrWhiteSpace(basePath) ? Directory.GetCurrentDirectory() : basePath;
   var builder = new ConfigurationBuilder().
    //SetBasePath(basePath).
    AddXmlFile(b =>
    {
     b.Path = configFileName;
     b.FileProvider = new PhysicalFileProvider(basePath);
    });
   return builder.Build();
}
違いは、IConfigurationBuilder の AddXmlFile メソッドを拡張することです。この例では、構成ファイル名と基本パスを渡すために public static IConfigurationBuilder AddXmlFile(この IConfigurationBuilder ビルダー、Actionae92d117680019c8adb696c6f7aa0015 configureSource) を使用します。 appsettings.xml 設定ファイル情報:

<MyConfig>
 <GaoDeApi>
 <UserName des="高德的账号">神牛步行1</UserName>
 <userPwd>111111</userPwd>
 </GaoDeApi>
 <BaiDuApi>
 <userName des="百度的账号">神牛步行2</userName>
 <userPwd>222222</userPwd>
 </BaiDuApi>
</MyConfig>

設定ノードを取得するために呼び出すコードの部分を見てみましょう:

var configXml = GetXmlConfig();
sbLog.Append($"xml配置-MyConfg节点的值:\n");
sbLog.Append($"高德-UserName:{configXml.GetSection("GaoDeApi:UserName").Value}\n");
sbLog.Append($"百度-userName:{configXml["BaiDuApi:UserName"]}\n\r\n");

xml と json が設定ノードを読み取ることがわかります。同様に、「:」は階層関係を示しますが、JSON メソッドに従う場合、xml には最外層とノードが必要ないことに特別な注意を払う必要があります。 MyConfig:GaoDeApi:UserName のようになります。図に示すように、この 2 つの違いは次のとおりです:

さらに、JSON と XML の構成情報を取得できます。


XML ノードを取得します。属性値


通常xml配置文件节点还有属性(attribute),如上面的xml节点: 7a286013418a1834dc7c3eeef39dd0f2神牛步行100d001d0ea2d832461d3ff9217bf550e ,这个des=""就是属性,我们要怎么才能获取这个值呢;这里其实同样还是通过':'来关联的,如下代码获取属性节点des的值:


sbLog.Append($"高德-UserName-des:{configXml.GetSection("GaoDeApi:UserName:des").Value}\n");
sbLog.Append($"百度-userName-des:{configXml["BaiDuApi:UserName:des"]}\n\r\n");

xml属性节点名称不能是name,不然是无法读取成功的;如这里的des改成name名称的话,无法正常获取信息,谨记于心;

配置文件能否不和应用放在一起呢? 答案是肯定的

有部分朋友会提出一个问题:配置文件能否不和应用放在一起呢? 答案是肯定的,我们只需把Directory.GetCurrentDirectory()(获取当前应用所在磁盘目录)替换成配置文件所在的基础目录就行了,如我这里的: configBasePath = @"D:\D\TTest";

下面是本次实例的整个测试用例代码:


using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Json;
using Microsoft.Extensions.FileProviders;
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
namespace MyService
{
 class Program
 {
  static void Main(string[] args)
  {
   Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
   Console.OutputEncoding = Encoding.GetEncoding("GB2312");
   var sbLog = new StringBuilder(string.Empty);
   var configBasePath = Directory.GetCurrentDirectory(); //configBasePath = @"D:\D\TTest";
   sbLog.Append($"配置文件所在目录:{configBasePath}\n");
   var builder = new ConfigurationBuilder().
    SetBasePath(configBasePath).
    AddJsonFile("appsettings.json");
   var config = builder.Build();
   sbLog.Append($"MyConfig:UserName节点的值:{config.GetSection("MyConfig:UserName").Value}\n\r\n");
   var configJson = GetJsonConfig();
   sbLog.Append($"json配置-MyConfg节点的值:\n");
   sbLog.Append($"高德-UserName:{configJson.GetSection("MyConfig:GaoDeApi:UserName").Value}\n");
   sbLog.Append($"百度-userName:{configJson["MyConfig:BaiDuApi:UserName"]}\n\r\n");
   var configXml = GetXmlConfig();
   sbLog.Append($"xml配置-MyConfg节点的值:\n");
   sbLog.Append($"高德-UserName:{configXml.GetSection("GaoDeApi:UserName").Value}\n");
   sbLog.Append($"百度-userName:{configXml["BaiDuApi:UserName"]}\n\r\n");
   sbLog.Append($"高德-UserName-des:{configXml.GetSection("GaoDeApi:UserName:des").Value}\n");
   sbLog.Append($"百度-userName-des:{configXml["BaiDuApi:UserName:des"]}\n\r\n");
   Console.WriteLine(sbLog);
   Console.ReadLine();
  }
  /// <summary>
  /// json配置文件读取
  /// </summary>
  /// <param name="configFileName"></param>
  /// <param name="basePath"></param>
  /// <returns></returns>
  public static IConfigurationRoot GetJsonConfig(
   string configFileName = "appsettings.json",
   string basePath = "")
  {
   basePath = string.IsNullOrWhiteSpace(basePath) ? Directory.GetCurrentDirectory() : basePath;
   var builder = new ConfigurationBuilder().
    SetBasePath(basePath).
    AddJsonFile(configFileName);
   return builder.Build();
  }
  /// <summary>
  /// xml配置文件读取
  /// </summary>
  /// <param name="configFileName"></param>
  /// <param name="basePath"></param>
  /// <returns></returns>
  public static IConfigurationRoot GetXmlConfig(
   string configFileName = "appsettings.xml",
   string basePath = "")
  {
   basePath = string.IsNullOrWhiteSpace(basePath) ? Directory.GetCurrentDirectory() : basePath;
   var builder = new ConfigurationBuilder().
    //SetBasePath(basePath).
    AddXmlFile(b =>
    {
     b.Path = configFileName;
     b.FileProvider = new PhysicalFileProvider(basePath);
    });
   return builder.Build();
  }
 }
}

以上が.NetCore が Json および Xml 形式で構成情報を取得する方法の説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。