🖼️

【.NET】Twitter APIを使って推しの画像に溺れたい④

2022/06/04に公開約4,100字

こんにちは。
日本ダービーでワイド2点当てました🎯アスクビクターモアくんありがとう!!
イクイノックスは親父と同じく菊花賞取ってくれよ!!!

今回は設定関連です。
ちょっと味気ないですが、もしかしたら同じ悩みを持っている人がいるかもしれないので...ね?

設定ファイル作成&読み込み

ここは大して派手な内容ではないので、サラっと終わらせます。

参考サイト

https://zenn.dev/higmasu/articles/b3dab3c7bea6db

パッケージ追加

  • Microsoft.Extension.Configuration.Binder
  • Microsoft.Extension.Configuration.Json

設定内容

以下ファイルをプロジェクト直下に配置します。

appsettings.json
{
  "ConsumeyKey": "I_AM_CONSUMER_KEY",
  "ConsumerKeySecret": "I_AM_CONSUMER_KEY_SECRET",
  "AccessToken": "I_AM_ACCESS_TOKEN",
  "AccessTokenSecret": "I_AM_ACCESS_TOKEN_SECRET",
  "BearerToken": "I_AM_BEARER_TOKEN",  // 使いませんがなんとなく入れてみた
  "ConnectionStrings": {
    "LocalDB": "LOCAL_DB",
    "MariaDB": "MARIA_DB"
  }
}

appsettings.jsonをビルドディレクトリに追加

VisualStudioで、appsettings.jsonを右クリックしプロパティを開きます。

プロパティ

右下に出てくるプロパティウィンドウで、「出力ディレクトリにコピー」に「常にコピーする」を選びます。

出力ディレクトリにコピー:常にコピーする

VSCode使ってて「そんなメニューねぇよ!」って場合は、csprojファイルを直接書き換えることもできます。

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.5" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.5">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="6.0.1" />
    <PackageReference Include="TweetinviAPI" Version="5.0.4" />
  </ItemGroup>

+  <ItemGroup>
+    <None Update="appsettings.json">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
</Project>

設定ファイルをモデルにバインド

プロジェクト配下にModelsディレクトリを作り、さらに下にSettingsディレクトリを作ります。
そしてSettingsの中に以下のコードを追加します。

AppSettings.json
namespace OshiPicCollector.Models.Settings
{
    internal class AppSettings
    {
        public string ConsumeyKey { get; set; }
        public string ConsumerKeySecret { get; set; }
        public string AccessToken { get; set; }
        public string AccessTokenSecret { get; set; }
        public string BearerToken { get; set; }
        public ConnectionStrings ConnectionStrings { get; set; } = new();
    }
}
ConnectionStrings.json
namespace OshiPicCollector.Models.Settings
{
    internal class ConnectionStrings
    {
        public string LocalDB { get; set; } = "";
        public string MariaDB { get; set; } = "";
    }
}

設定呼び出し

Program.cs
static async Task Main(string[] args)
{
    // ※GetCurrentdirectoryで得られるのはProgram.csではなくDLLのディレクトリ
    // 例)C:\Users\user\source\repos\OshiPicCollector\OshiPicCollector\bin\Debug\net6.0
    AppSettings settings = new ConfigurationBuilder()
	.SetBasePath(Directory.GetCurrentDirectory())
	.AddJsonFile("appsettings.json")
	.Build()
	.Get<AppSettings>();

    // ハードコーディングしていた認証キーをAppSettingsから取るように変更
    TwitterClient userClient = new(settings.ConsumeyKey, settings.ConsumerKeySecret, settings.AccessToken, settings.AccessTokenSecret);
    
    // ...
}

ブレークポイントで止めると...

👍👍👍

(おまけ)シングルトン

少し内容が少ないので、次回の内容に関連するDIシングルトンについて簡単に記載しておきます。

What is DI?

DI(Dependency Injection)とは、依存関係のあるオブジェクトを一括管理する場所(=DIコンテナ)を用意し、インスタンスを管理することでイチイチnewしなくても機能が使えるようにするものです。

プロジェクトで普遍的な機能(ログ出力、DB接続、...)を使うためにその場でイチイチnew Logger(...)とかnew DbConnection(...)とかをしてたらコードがムダにかさ張ってしまいます。
そこでインスタンスをDIコンテナに登録し一括管理することで、ソースコードがきれいになるし、何より結合度が下がることによる単体テストの容易化を実現することができます。

What is Singleton?

Singleton(シングルトン)とは、プログラムの実行の中でインスタンスがただ1つしか作られないオブジェクトのことです。
上記のDIコンテナに、ログ出力クラスやDB接続クラスをシングルトンとして登録することで、プログラム中のどこからでも単一のインスタンスを参照することを実現できます。

え?スープに浮いてそうな名前してるって?

それはクルトンや。

次回

いよいよバックエンドの花形(?)、データベース関連です。
これができればコンソールアプリはほぼ完成です。

Discussion

ログインするとコメントできます