fix execute context

This commit is contained in:
FrigaT
2026-04-13 15:41:44 +03:00
parent 21a0c5abe6
commit b8f78a5856
3 changed files with 34 additions and 24 deletions

View File

@@ -5,7 +5,7 @@ using YandexMusic.API.Common;
namespace YandexMusic.API.Models.Common;
/// <summary>Конвертер для внедрения контекста выполнения (API и хранилище) в модели.</summary>
public class YExecutionContextConverter : JsonConverter<YBaseModel>
public class YExecutionContextConverter : JsonConverter<object>
{
private readonly YandexMusicApi _api;
private readonly AuthStorage _storage;
@@ -16,26 +16,27 @@ public class YExecutionContextConverter : JsonConverter<YBaseModel>
_storage = storage;
}
public override YBaseModel? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
public override bool CanConvert(Type typeToConvert) =>
typeof(YBaseModel).IsAssignableFrom(typeToConvert);
public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
// Десериализуем объект без контекста
var obj = (YBaseModel?)JsonSerializer.Deserialize(ref reader, typeToConvert, options);
if (obj != null)
// Убираем этот конвертер из опций, чтобы избежать рекурсии
var innerOptions = new JsonSerializerOptions(options);
innerOptions.Converters.Remove(this);
var obj = JsonSerializer.Deserialize(ref reader, typeToConvert, innerOptions);
if (obj is YBaseModel baseModel)
{
obj.Context = new YExecutionContext
{
API = _api,
Storage = _storage
};
baseModel.Context = new YExecutionContext { API = _api, Storage = _storage };
}
return obj;
}
public override void Write(Utf8JsonWriter writer, YBaseModel value, JsonSerializerOptions options)
public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
{
// При сериализации игнорируем контекст
var cloneOptions = new JsonSerializerOptions(options);
cloneOptions.Converters.Remove(this);
JsonSerializer.Serialize(writer, value, cloneOptions);
var innerOptions = new JsonSerializerOptions(options);
innerOptions.Converters.Remove(this);
JsonSerializer.Serialize(writer, value, innerOptions);
}
}
}