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によって必要なところで値を取得できるので便利だと思った.