shuhelohelo’s blog

Xamarin.Forms多めです.

Xamarin.FormsでASP.NET Coreなappsettings.jsonから値を取得する

Xamarin.FormsでASP.NET CoreのDIの仕組みを使うことについては以下の記事に書きました.

shuhelohelo.hatenablog.com

これをベースとします.

今回は基本的なことに戻って,appsettings.jsonファイルに記述した値を取得する方法についてです.

以下のような内容のJSONファイルがあります.

{
  "Hello": "World",
  "Xamarin": {
    "Forms": "4.6"
  },
  "Environment": "Development",
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  }
}

ここには"Hello": "World"というKey-Valueペアがあります.

この"Hello"をキーとした値("World")を取得するにはどうするのか.

値の取得

ConfigureServicesメソッドが引数として受け取るHostBuilderContextクラスのインスタンスから取得できます.

        static void ConfigureServices(HostBuilderContext ctx, IServiceCollection services)
        {
        ・・・省略
        }

(個人的メモ:ここで取得して,必要なものはグローバルなオブジェクトに詰め替える,ということでよいのだろうか?)

  1. GetValueメソッドで取得
                var val1 = ctx.Configuration.GetValue<string>("Hello");

f:id:shuhelohelo:20200610002650p:plain

文字列として取得するだけなら型引数<string>は不要.

  1. Configurationプロパティから取得
                var val2 = ctx.Configuration["Hello"];

f:id:shuhelohelo:20200610004805p:plain

2階層以上の値の取得

以下のような2階層目の値を取得するにはどうしたらいいでしょうか.

  "Xamarin": {
    "Forms": "4.6"
  },

ASP.NET Coreだと,["Xamarin:Forms"]というように各階層のキーを:でつなげて指定するが,できるだろうか.

  1. 2階層目の値を取得する
                var val3 = ctx.Configuration["Xamarin:Forms"];//4.6

f:id:shuhelohelo:20200610011426p:plain

取得できました.

IConfigurationを使う

ここに詳しく書いてある.

docs.microsoft.com

もう一つ,読み込んだappsettings.json内の各値を取得する方法があり,それがIConfiguration経由で取得する方法.

コンストラクタにIConfiguration型の引数を設けておくと,そこにインスタンスが渡される.

特にAddSingletonなどで登録しておく必要はない.

例えば,以下のようなappsettings.jsonに以下のような内容を記述しておく.

{
  "Environment": "Release",
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  }
}

そして,コンストラクタの引数にIConfiguration型を設けておくと,

        public App(ILogger<App> logger,
                   Page appShell,
                   IConfiguration config)
        {
            var val = config["Environment"];

            InitializeComponent();

            MainPage = appShell;
        }

以下のように,configインスタンスが渡され,そしてそのインスタンスからEnvironmentという文字列をキーとしてReleaseという文字列を取得できることが確認できる.

f:id:shuhelohelo:20200704152103p:plain

こちらのほうが,DIによって必要なところで値を取得できるので便利だと思った.