似たような質問をたくさん読んだのですが、何もうまくいきませんでした。私はおそらく何か間違ったことをしているのですが、何がわかりません。
以下は、ErrorCodes.json
プロジェクトのルート(と同じレベルappsettings.json
)で呼び出された、私が作成した構成ファイルです。
{
"ErrorMap": {
"Type": {
"Input": {
"Null": {
"Code": "ABC-1000",
"Message": "The request body is null or empty"
},
"Name": {
"Code": "ABC-1001",
"Message": "The 'name' property was not set"
},
"Age": {
"Code": "ABC-1002",
"Message": "The 'age' property was not set"
},
"Email": {
"Code": "ABC-1003",
"Message": "The 'email' property was not set"
}
}
}
}
}
ではstartup.cs
I次のコンストラクタを持っています。
public Startup()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("ErrorCodes.json", optional: false, reloadOnChange: false)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: false);
this.configuration = builder.Build();
}
そして私のConfigureServices
方法はここにあります:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<ErrorMap>(configuration.GetSection(nameof(ErrorMap)));
services.AddSingleton(
context => context.GetRequiredService<IOptions<ErrorMap>>().Value);
)
services.AddSingleton<ErrorCodeConfig>();
// some other stuff
}
ErrorCodeConfigは、に依存する「bean」(C#の世界での名前はわかりません)でありErrorMap
、次のように定義されています。
public class ErrorCodeConfig
{
private readonly ErrorMap _errors;
public ErrorCodeConfig(ErrorMap errors)
{
_errors = errors;
}
public Error Get(string typeKey, string errorKey)
{
return _errors.Get(typeKey, errorKey);
}
}
クラスErrorMap
とError
は次のように定義されます。
public class ErrorMap
{
public Dictionary<string, Dictionary<string, Error>> Type;
public Error Get(string key, string key2)
{
return Type.GetValueOrDefault(key).GetValueOrDefault(key2);
}
}
public class Error
{
public string Code { get; set; }
public string Message { get; set; }
}
アプリケーションを実行できます。クラスDictionary
内を除いて、すべてが適切に挿入されますErrorMap
。それは残ってnull
おり、理由はわかりません。
これが私がこれまでに試したことです:
ConfigurationBuilder
読み取りの問題かどうかを確認したため、一時的にファイルの名前を変更しましたが、ファイルが見つからなかったため、例外がスローされました。したがって、少なくともファイルを見つけることができると思います。ErrorMap
ブロックを追加して、デフォルトの構成ファイルを挿入できるかどうかを確認しましたが、うまくいきませんでした。クラッシュしませんでしたが、configクラスにはまだデータが入力されていませんでした。私のプロジェクトで私が間違ったことについて何か考えがありますか?読んでくれてありがとう
私のコンピューターでテスト済み
var errorMap = new ErrorMap();
Configuration.GetSection(nameof(ErrorMap)).Bind(errorMap);
このバージョンのErrorMapで
public class ErrorMap
{
public Dictionary<string, Dictionary<string, Error>> Type { get; set; }
public Error Get(string key, string key2)
{
return Type.GetValueOrDefault(key).GetValueOrDefault(key2);
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加