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


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

Предостережение

Набор средств Microsoft Graph не рекомендуется использовать. Период выхода на пенсию начинается 1 сентября 2025 года, а полный выход на пенсию запланирован на 28 августа 2026 года. Разработчикам следует перейти на использование пакетов SDK для Microsoft Graph или других поддерживаемых средств Microsoft Graph для создания веб-интерфейсов. Дополнительные сведения см. в объявлении об устаревании.

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) });
}