Я не уверен в такой уловке, но вы можете ввести несколько методов расширения, чтобы принимать типизированные параметры для установки / извлечения значений кэша.
Один из возможных вариантов реализации - сериализация объекта, который будет кэшироваться.в 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>()
, используя метод сериализации, который лучше соответствует вашей иерархии объектов.