MiniAPI(四)：Configuration

設定ファイルは、各アプリケーションサービスプログラムが共通して使用する機能です。元の端末アプリケーション時代から現在のメタバース時代に至るまで、設定は自然に存在しています。asp.net coreは、強力な設定ファイルアクセスメカニズムを提供しており、MVC APIでもMiniAPIでも、使用方法は同じです。
フレームワークのデフォルト設定ファイルはappsettings.jsonで、json形式で独自の複雑な設定を保存できます：

```json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "ExamDatabase": "server=.;database=Exam;uid=sa;pwd=sa;"
  },
  "AppInfo": {
    "Name": "Mini & Powerful",
    "Version": "v1.0.0",
    "Author": {
      "Architect": "桂素伟-A",
      "Programmer": "桂素伟-P",
      "Designer": "桂素伟-D"
    },
    "Features": [ "Learn MiniAPI", "Architect Element" ]
  }
}
```

簡単に値を取得します

```csharp
var architect = builder.Configuration.GetSection("AppInfo:Author:Architect").Value;
var features1 = builder.Configuration.GetSection("AppInfo:Features:1").Value;
```

`record`でバインドします

```csharp
public record AppInfoRecord(string? Name, string? Version, AuthorRecord? Author, string[]? Features);
public record AuthorRecord(string? Architect, string? Programmer, string? Designer);
```

バインド

```csharp
var authorRecord = new AuthorRecord(null, null, null);
var appInfoRecord = new AppInfoRecord(null, null, authorRecord, null);
builder.Configuration.GetSection("AppInfo").Bind(appInfoRecord);
```

結果
![alt 画像](https://mmbiz.qpic.cn/mmbiz_png/4CAA63nvHRC1ObsW5yySwicojtMy3NtNRIPibdOMyXLTBxuGdryGsIyD9h4guXIsmdjKAtRxG9TgVefXZTYwibUbQ/640?wx_fmt=png)

`class`でバインドします

```csharp
public class AppInfo
{
    public string? Name { get; set; }
    public string? Version { get; set; }
    public Author? Author { get; set; }
    public string[]? Features { get; set; }
}

public class Author
{
    public string? Architect { get; set; }
    public string? Programmer { get; set; }
    public string? Designer { get; set; }
}
```

バインド

```csharp
var appInfo = new AppInfo();
builder.Configuration.GetSection("AppInfo").Bind(appInfo);
```

結果
![alt 画像](https://mmbiz.qpic.cn/mmbiz_png/4CAA63nvHRC1ObsW5yySwicojtMy3NtNR482aG1EWV4rb1JbvJnG1MokEfQuyIMicgM9dDUoicq24ic5txNdxt68VA/640?wx_fmt=png)

`record`と`class`でバインドすると、それぞれに利点があります。`record`による定義は、コードがシンプルでバインドがやや複雑になります。一方、`class`の定義はやや複雑で、バインド時にシンプルです。

IConfigurationから設定を取得します。
ルーティングメソッドで設定情報を取得できます。

```csharp
app.MapGet("/getappinfo", (IConfiguration config) =>
{
    return config.GetSection("AppInfo:Name").Value;
});
```

ルーティングから設定ファイルを取得します。
最初は注入します。

```csharp
var authorRecord = new AuthorRecord(null, null, null);
var appInfoRecord = new AppInfoRecord(null, null, authorRecord, null);
builder.Configuration.GetSection("AppInfo").Bind(appInfoRecord);
builder.Services.AddSingleton(appInfoRecord);
```

設定データを取得します。

```csharp
app.MapGet("/appinfo", (AppInfoRecord appinfo) =>
{
    return appinfo;
});
```

結果
![alt 画像](https://mmbiz.qpic.cn/mmbiz_png/4CAA63nvHRC1ObsW5yySwicojtMy3NtNRZ31tBrk4U1TVO83A2JXpV26aoE8M99DRBb31e7Da7iaMqyK66DswtiaQ/640?wx_fmt=png)

他の形式の設定ファイルを読む
myconfig.ini

```ini
[iniconfig]
key1=value1
key2=value2
```

設定ファイルをロードし、値を取得します。

```csharp
builder.Host.ConfigureAppConfiguration((hostingContext, config) =>{
    config.AddIniFile("myconfig.ini",
                      optional: true,
                      reloadOnChange: true);
});

var key1 = builder.Configuration.GetSection("iniconfig:key1").Value;
```

(Translated by GPT)

元のリンク：https://mp.weixin.qq.com/s?__biz=MzA3NDM1MzIyMQ==&mid=2247484817&idx=1&sn=dd4b5d5dced9ac5888c8a3926442078c&chksm=9f005abba877d3adc5c98cc6fd374537de6e41b61d05aac225fb845407c7510bf6580d32e82b&token=2050451386&lang=zh_CN#rd