Есть ли какое-либо соглашение или встроенная концепция, как вводить сериализатор Json? - PullRequest
0 голосов
/ 20 мая 2019

Контекст

В некоторых из моих классов в проекте ASP.NET сериализация / десериализация JSON Я предполагаю, что использование статических методов JsonConvert... не лучший вариант, равно как и использование new с жестко закодированным классом

Вопрос

Буду ли я вводить что-то в конструктор?Должен ли я определить свой собственный простой интерфейс для этой цели, или есть какое-то соглашение / встроенная концепция, как не жестко кодировать типы?

Ответы [ 3 ]

2 голосов
/ 20 мая 2019

Если это помогает, ASP.NET Core в некоторых местах абстрагирует сам сериализатор JSON.Например, в представлениях Razor (как в представлениях, так и на страницах) вы можете использовать Json.Serialize() для сериализации содержимого в теле.При этом используется IJsonHelper для предоставления абстрактного доступа к сериализации при использовании всех предварительно сконфигурированных настроек из сериализатора (обеспечение согласованного вывода).

В 2.2 основнойJsonHelper использует JsonOutputFormatter для фактического предоставления доступа к сериализатору.И IJsonHelper, и JsonOutputFormatter доступны посредством внедрения зависимостей, так что вы можете внедрять их в любом месте, если они вам нужны.

В версии 3.0 команда удаляет прямую зависимость от Newtonsoft.Json и представляетправильная абстракция себя.IJsonHelper все еще здесь.По умолчанию, Newtonsoft.Json не будет присутствовать, поэтому, если вы зависите от этого (например, потому что используете его статически), вам придется добавить зависимость самостоятельно (и, возможно, переключить ASP.NET Core обратно, чтобы использовать ее тоже).

Когда вы хотите десериализоваться, IJsonHelper вам не поможет, и вокруг нет компонента, который предоставил бы вам прямой доступ к десериализатору.В этих случаях вы всегда можете создать JsonSerializer самостоятельно.Вы можете получить настройки сериализатора из DI:

IOptions<MvcJsonOptions> mvcJsonOptions // get through DI

var serializer = JsonSerializer.Create(mvcJsonOptions.Options.SerializerSettings);

, который использует глобально сконфигурированные параметры сериализации из каркаса.

Обычно, просто использование статического JsonConvert тоже подойдет.В общем, вы должны попытаться избежать сериализации и десериализации материала самостоятельно.Фреймворк уже позаботится об этом для вас в различных местах, где данные входят или выходят.Поэтому, в зависимости от вашего варианта использования, может уже существовать автоматическое преобразование между JSON.

0 голосов
/ 20 мая 2019

Лично я бы не стал беспокоиться об абстрагировании такой службы, как сериализатор JSON. Не все статические данные неверны, и не все должны быть абстрагированы в сервисе, за исключением случаев, когда ожидается, что вы захотите поменять местами реализации или создать макеты для тестирования. В противном случае я бы посоветовал сосредоточиться на бизнес-логике вашего приложения и создавать абстракции, только если они необходимы и обеспечивают ценность для дизайна и тестируемости приложения.

0 голосов
/ 20 мая 2019

Это не специфично для сериализации JSON. Как и в случае любого статического класса, вы не можете применить к нему интерфейс (не говоря уже о стороннем классе). См., Например, Внедрение зависимостей с помощью статического регистратора, класс статического помощника .

Итак, вам нужно написать свой собственный класс-обертку и ввести следующее:

public interface IJsonSerializer
{
    string SerializeObject(object o);
    T DeserializeObject<T>(string json);
}

public class NewtonsoftJsonSerializer : IJsonSerializer
{
    public string SerializeObject(object o)
    {
        return Newtonsoft.Json.JsonConvert.SerializeObject(o);
    }

    public T DeserializeObject<T>(string json)
    {
        return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
    }
}
...