сессия в качестве эталона .net core - PullRequest
0 голосов
/ 08 мая 2018

Я новичок в .net core. Я использую сессию в ядре .net, но я вижу, что когда я использую сложный объект, я должен сериализовать / десериализовать объект, а затем сохранить в сессии.

Это означает, что когда я загружаю сложный объект из сеанса, мне нужно сериализовать и сохранять этот объект в сеансе каждый раз в конце состояния страницы.

Есть хитрость для сериализации / сохранения объекта только при изменении объекта?

(Я имею в виду, что в asp.net сохранение / загрузка сеанса автоматизировано, в ядре .net есть аналогичная работа?)

спасибо всем.

1 Ответ

0 голосов
/ 08 мая 2018

Я не уверен в такой уловке, но вы можете ввести несколько методов расширения, чтобы принимать типизированные параметры для установки / извлечения значений кэша.

Один из возможных вариантов реализации - сериализация объекта, который будет кэшироваться.в JSON, а затем кэшировать его представление UTF8.Используя Json.NET PreserveReferencesHandling.All можно сериализовать всю иерархию объектов со всеми необходимыми зависимостями, чтобы можно было восстановить всю иерархию при десериализации.

public static class TypedSessionValuesExtensions
{
    public static void Set<T>(this ISession session, string key, T value)
    {
        var json = JsonConvert.SerializeObject(value,
            new JsonSerializerSettings {
                PreserveReferencesHandling = PreserveReferencesHandling.All
            });
        var bytes = Encoding.UTF8.GetBytes(json);
        session.Set(key, bytes);
    }

    public static bool TryGetValue<T>(this ISession session, string key, out T value)
    {
        byte[] bytes;
        if (!session.TryGetValue(key, out bytes))
        {
            value = default(T);
            return false;
        }
        try
        {
            var json = Encoding.UTF8.GetString(bytes);
            value = JsonConvert.DeserializeObject<T>(json);
            return true;
        }
        catch
        {
            value = default(T);
            return false;
        }
    }
}

Обратите внимание, что в случае сложных иерархий и различных кэшированных значений, ссылающихся на одни и те же объекты, этот подход может добавить ненужные издержки и дублирование десериализованных объектов.В этом случае вы можете реализовать расширение Set<T>() и TryGetValue<T>(), используя метод сериализации, который лучше соответствует вашей иерархии объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...