Использование кэша карточек 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()
});
Кэш полностью потокобезопасен, т.е. к нему возможен одновременный доступ из нескольких потоков.