Конфигурация json с параметрами вместе с DI .NET
У меня возникла проблема при конфигурировании приложения с использованием внедрения зависимостей и IOptions<T>. У программы есть конфиг с пользовательскими настройками. Для редактирования настроек пользователь может использовать саму программу, но я допускаю, что любознательный пользователь может хотеть открыть сам файл конфигурации. Для этого я стараюсь поддерживать его в красивом виде. Чтобы это сделать, нужно использовать некоторые опции и атрибуты. К примеру, сериализация перечислений в виде именований, а не значений. Для этого требуется использовать JsonStringEnumConverter, но поставщик конфигурации json видимо это делает за меня. Было бы всё отлично, но с .NET 9 пришла возможность задавать иные имена полям перечисления для сериализации. Для этого был добавлен JsonStringEnumMemberNameAttribute, который поставщик конфигураций json видимо не использует и из-за чего я не могу сделать конфиги еще краше.
Мне кажется, что для решения проблемы нужно писать свой поставщик. Может быть я что-то упускаю и у кого-то есть более элегантное решение?
UPD: Небольшой пример о чём идет речь. Есть у меня модель с одним свойством типа перечисления. Объект модели сериализую в json и сохраняю в файл, после чего, когда пытаюсь загрузить эту конфигурацию, то хаваю эксепшен.
[Flags]
public enum Sport
{
[JsonStringEnumMemberName("None")]
None = 0,
[JsonStringEnumMemberName("Football")]
Football = 1,
[JsonStringEnumMemberName("Basketball")]
Basketball = 2,
[JsonStringEnumMemberName("Ping-Pong")]
PingPong = 4,
[JsonStringEnumMemberName("Race-Walking")]
RaceWalking = 8,
[JsonStringEnumMemberName("Greco-Roman-Wrestling")]
GrecoRomanWrestling = 16,
}
...
internal sealed partial class App : Application
{
private readonly IHost _host;
public App()
{
HostApplicationBuilder builder = Host.CreateApplicationBuilder();
builder.Configuration.AddJsonFile(FullPath.UserSettings, false, true);
_host = builder.Build();
_host.RunAsync();
...
Далее сохраняю конфигурацию со следующими параметрами:
JsonSerializerOptions jsonSerializerOptions = new()
{
WriteIndented = true,
Converters =
{
new JsonStringEnumConverter()
},
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
};
В том случае, если имею модель:
public class Player
{
public Sport Sports { get; set; }
}
Получаю следующий примерный файл:
{
"Player": {
"Sports": "Football, Ping-Pong, Greco-Roman-Wrestling"
}
}
После чего при загрузки данных получаю эксепшен. Мне кажется, нужно реализовать свой поставщик, чтобы можно было передать ему параметры сериализации, если, конечно, так можно.