Поделиться через


Кэширование Microsoft Graph Toolkit

Microsoft Graph Toolkit поддерживает кэширование выбранных вызовов API Microsoft Graph. Вызовы кэшируются для каждой сущности, например людей, контактов, фотографий. Это позволяет одному компоненту извлекать данные, а другим компонентам — повторно использовать их без вызова Microsoft Graph.

Совет

Дополнительные сведения о том, какие сущности кэшируются каждым компонентом, см. в документации для этого компонента.

Базы данных, созданные с помощью набора средств для кэширования, имеют префикс mgt-. Данные для каждой сущности хранятся в отдельном хранилище объектов. Чтобы проверить кэш, используйте вкладку Приложение на панели разработчика (средства F12). В разделе Хранилище выберите вкладку IndexedDB .

средства разработчика 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) });
}