ユーザーシークレットの動きについてちょっと調べてみた

お久しぶりです。100億年ぶりにプログラミングを始めました。
先日、Visual Studio 2019をダウンロードして、何やらいろいろ調べながらやっています。
DBの接続文字列など、以前は config ファイルに書いていたように記憶していますが、何やらいろいろ仕組みが変わっていて、今は appsettings.json に書くのがよさそう。
appsettings.json に関連して、機密情報を扱うときは「ユーザーシークレット」なるものを使うと良さげなことを知ったのですが、ちょっと気になったことを確かめてみました。

appsettings.jsonとダブった項目はどうなるのか?

ユーザーシークレットが使われるみたいです。以下のように記載して確かめてみました。

/* appsettings.json */
{
  "Login": {
    "Email": "hoge@example.com",
    "Password": "hoge"
  }
}
/* secret.js */
{
  "Login": {
    "Email": "secret@example.com",
    "Password": "secret"
  }
}

secret.jsonが存在しない場合はどうなるのか?(git clone した場合など)

ちゃんとappsettings.jsonの値が取得されました。

ユーザーシークレットに関する設定はプロジェクトファイルに以下のように記述されるようです。
この長いIDと同じ名前のフォルダが C:\Users\【ユーザー名】\AppData\Roaming\Microsoft\UserSecrets に作られて、その中に secret.json が置かれるようです。この設定を残したまま、ユーザーシークレットのフォルダを消して確認してみました。

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <UserSecretsId>7a0d510b-d5ad-477a-a103-0d4d117cb851</UserSecretsId>
  </PropertyGroup>

</Project>

DIってなんだっけ?

appsettings.json で設定した値を取得するために、HomeController クラスのコンストラクタの引数を追加したけど、なんで好き勝手にコンストラクタの引数増やして良いの?何が起きてるの?勉強しよう。