Не Используйте JSON-Сериализатор Напрямую в Коде. Начало
Вероятно, в большинстве приложений вам придётся работать с JSON. Запросы/ответы или настройки приложения — вам всё равно придётся обрабатывать JSON.
И System.Text.Json, и Newtonsoft.Json предоставляют статические классы для сериализации и десериализации, поэтому очень заманчиво использовать их как есть:
using System.Text.Json;
Person person = new();
var json = JsonSerializer.Serialize(person);
Однако использование этих статических классов приводит к ряду проблем, таких как:
- Жёсткая связь с реализацией. Если позже вы захотите перейти с System.Text.Json на Newtonsoft.Json или настроить поведение, это может привести к значительному рефакторингу;
- Отсутствие внедрения зависимостей. Гораздо удобнее, когда класс явно объявляет свои зависимости через конструктор. Со статическими сериализаторами это неочевидно или даже невозможно;
- Сложность модульного тестирования. Если класс имеет жёсткую зависимость от статического сериализатора, его сложно изолировать и использовать в качестве заглушки во время тестирования.
Поэтому существуют некоторые подходы, помогающие избежать этих проблем. Один из них — создать абстракцию над сериализатором и использовать её единообразно во всей системе:
interface ISerializer
{
Task<string> SerializeAsync(object obj, Type type);
Task<object> DeserializeAsync(string json, Type type);
}
Для более удобного использования можно создать обобщённый метод расширения:
static class SerializerExtensions
{
extension(ISerializer serializer)
{
public Task<string>
SerializeAsync<TValue>(TValue value)
{
return serializer
.SerializeAsync(value, typeof(TValue));
}
public async Task<TValue>
DeserializeAsync(string json)
{
return (TValue)await serializer
.DeserializeAsync(
json,
typeof(TValue));
}
}
}
Теперь регистрируем сериализатор в DI-контейнере и используем его там, где нам нужно, как в этом примере:
class Handler(ISerializer serializer)
{
public Task<Result> InvokeAsync(Command command)
{
return serializer.DeserializeAsync(command.Json);
}
}
Окончание следует…
Источник: https://medium.com/@denmaklucky/dont-use-a-json-serializer-directly-in-your-code-instead-do-this-72f8eff3fdc5