Xamarin.FormsでASP.NET Coreなappsettings.jsonから値を取得する
Xamarin.FormsでASP.NET CoreのDIの仕組みを使うことについては以下の記事に書きました.
これをベースとします.
今回は基本的なことに戻って,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) { ・・・省略 }
(個人的メモ:ここで取得して,必要なものはグローバルなオブジェクトに詰め替える,ということでよいのだろうか?)
- GetValueメソッドで取得
var val1 = ctx.Configuration.GetValue<string>("Hello");
文字列として取得するだけなら型引数<string>
は不要.
- Configurationプロパティから取得
var val2 = ctx.Configuration["Hello"];
2階層以上の値の取得
以下のような2階層目の値を取得するにはどうしたらいいでしょうか.
"Xamarin": { "Forms": "4.6" },
ASP.NET Coreだと,["Xamarin:Forms"]
というように各階層のキーを:
でつなげて指定するが,できるだろうか.
- 2階層目の値を取得する
var val3 = ctx.Configuration["Xamarin:Forms"];//4.6
取得できました.
IConfigurationを使う
ここに詳しく書いてある.
もう一つ,読み込んだ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
という文字列を取得できることが確認できる.
こちらのほうが,DIによって必要なところで値を取得できるので便利だと思った.