Перечисления — DotNet 7, EntityFramework Core 7, System.Text
Каждый разработчик программного обеспечения сталкивался с этой ситуацией при работе с веб-API, где Enums отображается в виде чисел, следующих некоторым шаблонам.
Здесь показана схема, в которой у меня есть модель «UserEntity» с некоторыми свойствами, такими как Id, FirstNameи UserRoles. сильный>. Идентификатор и FirstName представляют собой просто intи строкуно для UserRoles он принимает массив чисел [0,1,2]. Ждать! Что? Но я сделал красивые модели/DTO с Enums для простоты понимания. Что я скажу разработчикам интерфейса ? Играть с числами и усложнять себе жизнь, записывая конверсии ?
Давайте упростим нашу жизнь :)
Технические подробности: я буду использовать DotNet 7 с EntityFramework Core 7вместе с базой данных InMemory.
Я создал проект веб-API, используя нашу любимую JetBrains Rider IDEдляDotNet. Создал базовый UserEntity вместе с настройкой DbContext. (Никаких причудливых вещей)
public class UserEntity { public long Id { get; set; } public string? FirstName { get; set; } public UserRoles UserRoles { get; set; } } public enum UserRoles { None, Admin, User }
Используя некоторую базовую логику для сохранения этого UserEntity и возврата сохраненного UserEntity, я получаю этот ответ, где наши Enum UserRoles представлены числами.
Не вдаваясь в подробности, почему это так (просто погуглите, как сохраняются Enum), мы исправим нашу жизнь с помощью одной единственной Аннотации, используя System.Text.Json.Serialization на наше свойство Enum UserRoles.
[JsonConverter(typeof(JsonStringEnumConverter))] public class UserEntity { public long Id { get; set; } public string? FirstName { get; set; } [JsonConverter(typeof(JsonStringEnumConverter))] public UserRoles UserRoles { get; set; } }
Теперь, если я использую ту же конечную точку контроллера, я получаю более удобочитаемое свойство UserRoles
Это было так просто! Мир стал лучше, верно? Я знаю. Добро пожаловать.
Но схема Swagger для моего UserEntity по-прежнему показывает тот же массив чисел, что и в начале. Не волнуйтесь, еще один лайнер 😆
Перейдите в Program.cs и найдите
builder.Services.AddControllers();
и добавьте это рядом с ним. Простой !
builder.Services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()));
Теперь у вас есть простые для чтения Enums в ваших веб-API. Наслаждаться!
Совет для бэкенд-разработчиков: просто используйте Enum.Parse‹T›() для анализа строк из ваших API.
Я также хотел бы поделиться интересной статьей, связанной с Enums и API, которую мне довелось проверить, решая эту проблему.
Рекомендация : https://medium.com/codex/should-your-api-use-enums-340a6b51d6c3 Теда Спенса