Blazor Serverでappsettings.jsonの値を取る。Azure App Serviceに発行したときはAzure上で設定した構成→アプリケーション設定で設定した値を取る。

~~タイトルの内容を試行錯誤中(´･ω･`)~~
~~.NET5以前の情報もいっぱい引っ掛かって何も分からん状態…~~
~~appsettings.jsonじゃなくてweb.configから取るべきなのか…？~~

何とかできたっぽい。

# 参考にしたページ
- [.NET - オプションパターンでアプリケーション構成を型付きで取得するが、一部だけ動的に読み取りたい](https://devadjust.exblog.jp/28937879/)

- [ASP.NET Core のオプション パターン](https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/configuration/options?view=aspnetcore-7.0)
- [ASP.NET Core Blazor の構成](https://learn.microsoft.com/ja-jp/aspnet/core/blazor/fundamentals/configuration?view=aspnetcore-7.0)
- [ASP.NET Web Forms 開発者向け Blazor 電子書籍 - アプリの構成](https://learn.microsoft.com/ja-jp/dotnet/architecture/blazor-for-web-forms-developers/config)
- [Microsoft.Extensions.Options Deep Dive](https://gist.github.com/yfakariya/ff6cd9653509181c8191f875e45be80f)
- [接続文字列をAzure App Service側に持たせる](https://shuhelohelo.hatenablog.com/entry/2019/12/20/140847)
- [[ ASP.NET ] Web.config の値を取得 ( ConfigurationManager ) - 偏差値40プログラマー](https://takataka430.hatenablog.com/entry/2021/05/29/162545)
- [AppServiceの接続文字列に騙されるな！](https://qiita.com/YOS0602/items/ae86ff0443598899e32e)

# 環境
- .NET7
- Visual Studio 2022

# appsettings.jsonの値を取る。
## ケース①：IConfigurationから取る

~~何故かビルド通らなくなった… GetConnectionStringが未定義なら逆に何故今までビルドが通っていた…？~~
~~(エラーメッセージ)~~
~~'IConfiguration' に 'GetConnectionString' の定義が含まれておらず、最も適している拡張メソッド オーバーロード 'ConfigurationExtensions.GetConnectionString(IConfiguration, string)' には 'IConfiguration' 型のレシーバーが必要です~~
→解決したので別エントリに
[Blazorで何故かIConfiguration(ConfigurationManager)のDIができない](https://qiita.com/SGTY/items/e61e10bd533c847fa5f1)

```json:appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "$comment": "↓追加したヤツ",
  "ConnectionStrings": {
    "db_con": "(接続文字列)"
  }
}
```

```c#:ConnectionStrings.cs
namespace BlazorServerTestWeb.Utility {
  public class ConnectionStrings {
    public string db_con { get; set; } = "";
  }
}
```

```c#:Index.razor
@page "/"
@using BlazorServerTestWeb.Utility
@inject IConfiguration config;

db_con = @connection_str.db_con

@code {
    private ConnectionStrings connection_str = new ();

    protected override void OnInitialized() {
        config.GetSection(nameof(ConnectionStrings)).Bind(connection_str);
        //今回みたいにConnectionStringsならGetConnectionStringが使える。
        //connection_str.db_con = config.GetConnectionString("db_con");
    }
}
```

## ケース②：IOptions\<TOptions\>経由で取る
```c#:Program.cs
//(前略)
builder.Services.Configure<ConnectionStrings>(
  builder.Configuration.GetSection(nameof(ConnectionStrings))
);

var app = builder.Build();
//(後略)
```

```c#:Index.razor
@page "/"
@using BlazorServerTestWeb.Utility
@using Microsoft.Extensions.Options
@inject IOptions<ConnectionStrings> _options;

db_con = @connection_str.db_con

@code {
    private ConnectionStrings connection_str = new ();

    protected override void OnInitialized() {
        connection_str = _options.Value;
    }
}
```

# ~~Azureに発行してみたけど動かん…何故…？~~ →ちょっと待ったら動いた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65842/d32b97f1-f5d6-067d-f25a-fe091579a1d6.png)

# ~~でもApp Service側で設定した接続文字列が取れない…どうやったらいいんだろうか…？~~ → できた！
NugetでSystem.Configuration.ConfigurationManager入れて使ってみる
→だめぽ

接続文字列じゃ無くてアプリケーション設定の方ならちゃんと取れてる。
どこがどうだめなんやろうか・・・(´･ω･`)

→これだ。
[AppServiceの接続文字列に騙されるな！](https://qiita.com/YOS0602/items/ae86ff0443598899e32e)

```json:appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "$comment": "↓追加したヤツ",
  "db_con": "(appsettings.json の db_con)",
  "POSTGRESQLCONNSTR_db_con": "(appsettings.json の POSTGRESQLCONNSTR_db_con)",
  "ConnectionStrings": {
    "db_con": "(appsettings.json の ConnectionStrings の db_con)"
  }
}
```

```c#:Index.razor
@page "/IConfiguration"
@using Microsoft.Extensions.Configuration
@inject IConfiguration config;

config.GetConnectionString("db_con") = @connection_str1<br/>
config["ConnectionStrings:db_con"] = @connection_str2<br />
config["db_con"] = @connection_str3<br />
config["POSTGRESQLCONNSTR_db_con"] = @connection_str4<br />

@code {
    private string? connection_str1;
    private string? connection_str2;
    private string? connection_str3;
    private string? connection_str4;

    protected override void OnInitialized() {
        connection_str1 = config.GetConnectionString("db_con");
        connection_str2 = config["ConnectionStrings:db_con"];
        connection_str3 = config["db_con"];
        connection_str4 = config["POSTGRESQLCONNSTR_db_con"];
    }
}
```

- App Service設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65842/ce74a233-12da-9361-27f7-5b1d662c3df1.png)

- ローカル実行結果
config.GetConnectionString("db_con") = (appsettings.json の ConnectionStrings の db_con)
config["ConnectionStrings:db_con"] = (appsettings.json の ConnectionStrings の db_con)
config["db_con"] = (appsettings.json の db_con)
config["POSTGRESQLCONNSTR_db_con"] = (appsettings.json の POSTGRESQLCONNSTR_db_con)

- App Service実行結果
config.GetConnectionString("db_con") = (appsettings.json の ConnectionStrings の db_con)
config["ConnectionStrings:db_con"] = (appsettings.json の ConnectionStrings の db_con)
config["db_con"] = App Serviceのアプリケーション設定で設定したdb_con
config["POSTGRESQLCONNSTR_db_con"] = App Serviceの接続文字列で設定したdb_con

# 結論：BlazorはASP.NETじゃないので「接続文字列」じゃなくて「アプリケーション設定」を使お
そうしよう。