Кэширование Microsoft Graph Toolkit
Microsoft Graph Toolkit поддерживает кэширование выбранных вызовов API Microsoft Graph. Вызовы кэшируются для каждой сущности, например людей, контактов, фотографий. Это позволяет одному компоненту извлекать данные, а другим компонентам — повторно использовать их без вызова Microsoft Graph.
Совет
Дополнительные сведения о том, какие сущности кэшируются каждым компонентом, см. в документации для этого компонента.
Базы данных, созданные с помощью набора средств для кэширования, имеют префикс mgt-
. Данные для каждой сущности хранятся в отдельном хранилище объектов. Чтобы проверить кэш, используйте вкладку Приложение на панели разработчика (средства F12). В разделе Хранилище выберите вкладку IndexedDB .
Конфигурация кэша
Вы можете читать и записывать параметры кэша с помощью объекта статического класса CacheService.config
. В следующем примере показан формат .
let config = {
defaultInvalidationPeriod: number,
isEnabled: boolean,
people: {
invalidationPeriod: number,
isEnabled: boolean
},
photos: {
invalidationPeriod: number,
isEnabled: boolean
},
users: {
invalidationPeriod: number,
isEnabled: boolean
},
presence: {
invalidationPeriod: number,
isEnabled: boolean
},
groups: {
invalidationPeriod: number,
isEnabled: boolean
},
response: {
invalidationPeriod: number,
isEnabled: boolean
},
files: {
invalidationPeriod: number,
isEnabled: boolean
},
fileLists: {
invalidationPeriod: number,
isEnabled: boolean
}
};
Для отдельных периодов недействительности кэша в объекте конфигурации по умолчанию задано значение null
, а общее значение по умолчанию для defaultInvalidationPeriod
составляет 3 600 000 мс (60 минут). Любое значение, переданное в config.x.invalidationPeriod
, переопределяет defaultInvalidationPeriod
.
Единственным исключением является хранилище присутствия со значением по умолчанию 300 000 мс, или 5 минут.
Примеры
Чтобы отключить хранилище, просто задайте для isEnabled
в свойствах конфигурации хранилища значение false:
import { CacheService } from '@microsoft/mgt-element';
CacheService.config.users.isEnabled = false;
Отключение кэша не очищает кэш.
Изменить период недействительности можно следующим образом:
import { CacheService } from '@microsoft/mgt';
CacheService.config.users.invalidationPeriod = 1800000;
Очистка кэша
Кэш автоматически очищается, когда пользователь выходит. Его также можно очистить вручную.
Чтобы очистить все хранилища в кэше для пользователя, выполнившего вход, используйте clearCacheById()
метод CacheService
класса , указав идентификатор кэша пользователя. Чтобы получить идентификатор кэша пользователя, вызовите getCacheId
метод из Providers
класса .
import { Providers } from '@microsoft/mgt';
import { CacheService } from '@microsoft/mgt-element';
const cacheId = await Providers.getCacheId();
await CacheService.clearCacheById(cacheId);
Создание собственных хранилищ кэша
Если вы хотите создать и заполнить собственные хранилища кэша для пользовательских компонентов, используйте статический CacheService
класс.
CacheService.getCache(schema: CacheSchema, storeName: String);
Примечание. Объект
storeName
, на который вы ссылаетесь в вызовеgetCache()
, должен соответствовать одному из хранилищ, перечисленных в объектеCacheSchema
.
Объект CacheSchema
является словарем с парами "ключ-значение".
import { CacheSchema } from '@microsoft/mgt-element';
const cacheSchema: CacheSchema = {
name: string,
stores: {
store1: {},
store2: {},
...
},
version: number
};
В примере ниже показана реализация кэша.
import { CacheItem, CacheSchema, CacheService, CacheStore } from '@microsoft/mgt-element';
const cacheSchema: CacheSchema = {
name: 'users',
stores: {
users: {},
usersQuery: {}
},
version: 1
};
interface CacheUser extends CacheItem {
user?: string;
}
// retrieves invalidation time from cache config
const getUserInvalidationTime = (): number =>
CacheService.config.users.invalidationPeriod || CacheService.config.defaultInvalidationPeriod;
// checks for if cache is enabled
const usersCacheEnabled = (): boolean => CacheService.config.users.isEnabled && CacheService.config.isEnabled;
// declare the desired cache store
let cache: CacheStore<CacheUser>
// check if the cache is enabled
if (usersCacheEnabled()) {
cache = CacheService.getCache<CacheUser>(cacheSchema, 'users');
const user = await cache.getValue(query);
// check if an item is retrieved, and if it's not expired
if (user && getUserInvalidationTime() > Date.now() - user.timeCached) {
return JSON.parse(user.user);
}
}
// graph call
const graphRes = graph
.api('me')
.middlewareOptions(prepScopes('user.read'))
.get();
// store graph result into the cache if cache is enabled
if (usersCacheEnabled()) {
cache.putValue(userId, { user: JSON.stringify(graphRes) });
}