Перейти к содержанию

Использование кэша карточек ICardCache

Использование кэша карточек ICardCache

Если требуется получить данные из карточки-синглтона (обычно это карточка с настройками), то на клиенте или на сервере достаточно из Unity отрезолвить ICardCache и использовать следующий код:

ICardCache = unityContainer.Resolve<ICardCache>(); Card singletonCard = cardCache.Cards["ИмяТипаКарточкиСинглтона"];

// здесь можно читать данные из карточки int magicNumber = singletonCard.Sections["MagicSection"].Get<int>("MagicNumber");

Если нужно хранить произвольные настройки не через карточку-синглтон, причём любые настройки, а не только сериализуемые, то рекомендуется задействовать cardCache.Settings. При этом подразумевается, что если на клиенте значения нет, то клиент передаёт лямбда-выражение со способом заполнения этого значения.

int sourceNumber = 42;

// Получаем значение по ключу "MagicNumber". Если значение отсутствует - создаём его. int magicNumber = cardCache.Settings.Get<int>("MagicNumber", key => sourceNumber); // = 42

// А теперь предположим, что sourceNumber - это некий внешний ресурс, который изменился (например, в базе) sourceNumber = 43;

// Если значения не было в кэше, то оно туда добавляется, // и при повторном вызове метод @Get@ обращений к sourceNumber не будет magicNumber = cardCache.Settings.Get<int>("MagicNumber", key => sourceNumber); // = 42

// Тот, кто изменил данные, влияющие на значение "MagicNumber" должен уведомить об этом прочих потребителей кэша. // На сервере это позволит сбросить для конкретной настройки весь кэш для любых серверных процессов, // на клиенте же - сбрасывает только локальный кэш приложения. cardCache.Settings.Invalidate("MagicNumber");

// Поскольку значения в кэше уже нет, то выполняется обращение к источнику - sourceNumber. magicNumber = cardCache.Settings.Get<int>("MagicNumber", key => sourceNumber); // = 43

Если связанных настроек больше одной и выбор пал на cardCache.Settings, то лучше использовать сложный объект, доступный по одному ключу, чем несколько простых, доступных по разным ключам.

public class SomeComplexType { public int MagicNumber { get; set; } public string MagicWord { get; set; } }

var value = cardCache.Settings .Get<SomeComplexType>( "Magic", key => new SomeComplexType { MagicNumber = 42, MagicWord = GetMagicFromDatabase() });

Кэш полностью потокобезопасен, т.е. к нему возможен одновременный доступ из нескольких потоков.

Back to top