ПО промежуточного слоя

ПРИМЕНИМО К: Пакет SDK версии 4

ПО промежуточного слоя — это просто класс, который находится между адаптером и логикой бота, добавленный в коллекцию промежуточного программного обеспечения адаптера во время инициализации. Пакет SDK позволяет писать собственное или добавлять созданное другими пользователями ПО промежуточного слоя. Любые входящие или исходящие действия вашего бота будут передаваться через ПО промежуточного слоя.

Адаптер обрабатывает и направляет входящие действия через конвейер ПО промежуточного слоя бота в логику бота, а затем снова возвращается. Каждый поток действий входа и выхода бота, каждый компонент ПО промежуточного слоя может проверять или выполнять действие до и после запуска логики бота.

Прежде чем переходить к ПО промежуточного слоя, важно понять ботов в целом и как они обрабатывают действия.

Использование ПО промежуточного слоя

Часто возникает вопрос: "Когда следует реализовывать действия в качестве ПО промежуточного слоя и использовать обычную логику бота?" ПО промежуточного слоя предоставляет дополнительные возможности для взаимодействия с потоком беседы пользователей до и после обработки каждого этапа беседы. Кроме того, ПО промежуточного слоя позволяет сохранять и извлекать сведения, касающиеся диалога, а также при необходимости вызывать дополнительную логику обработки. Ниже описаны некоторые распространенные сценарии применения ПО промежуточного слоя.

Просмотр каждого действия и его выполнение

Есть множество ситуаций, которые требуют от бота соответствующего поведения для всех действий или только для отдельных действий определенного типа. Например, может потребоваться регистрировать каждое действие сообщения, которое получает бот, или предоставить резервный ответ, если бот не создал ответ в противном случае. ПО промежуточного слоя — отличное место для таких процессов, благодаря возможности действовать как до, так и после выполнения остальной части логики бота.

Изменение или расширение контекста включения

Некоторые общения могут быть намного плодотворнее, если бот имеет больше информации, чем предусмотрено в этом действии. ПО промежуточного слоя в этом случае может просмотреть текущие сведения о состоянии беседы, запросить источник внешних данных и добавить это к объекту контекста реплик перед передачей выполнения логике бота.

В пакете SDK определено ПО промежуточного слоя для ведения журнала, которое позволяет записывать входящие и исходящие действия. Но вы можете определить собственное ПО промежуточного слоя.

Конвейер ПО промежуточного слоя бота

Адаптер вызывает ПО промежуточного слоя для каждого действия в том порядке, в котором оно было добавлено. Адаптер передает объект контекста для возвращения и следующего делегата, а ПО промежуточного слоя вызывает делегат для передачи управления следующему промежуточному программному обеспечению в конвейере. ПО промежуточного слоя также имеет возможность выполнять действия после возвращения следующего делегата до завершения метода. Можно представить, что каждый объект ПО промежуточного слоя имеет первую и последнюю возможность действовать в отношении объектов ПО промежуточного слоя, которые следуют за ним в конвейере.

Пример:

  • Обработчик поворота первого объекта ПО промежуточного слоя выполняет код перед вызовом следующего вызова.
    • Второй обработчик по промежуточного слоя выполняет код перед вызовом следующего.
      • Обработчик шагов бота выполняется и возвращается.
    • Второй обработчик поворота объекта ПО промежуточного слоя выполняет любой оставшийся код перед возвратом.
  • Обработчик поворота первого объекта ПО промежуточного слоя выполняет любой оставшийся код перед возвратом.

Если ПО промежуточного слоя не вызывает следующего делегата, адаптер не вызывает ни одного из последующих обработчиков промежуточного слоя или обработчиков шагов бота и замыкания конвейера.

После завершения работы конвейера ПО промежуточного слоя бота возвращение завершается и его контекст выходит за пределы области.

ПО промежуточного слоя или бот могут создавать ответы и регистрировать обработчики событий ответа, но учитывайте, что ответы обрабатываются в отдельных процессах.

Порядок выполнения ПО промежуточного слоя

Поскольку порядок добавления ПО промежуточного слоя определяет порядок, в котором оно обрабатывает действие, важно определить последовательность добавления ПО промежуточного слоя.

Примечание

Это дает общий шаблон, который работает для большинства ботов, но имейте ввиду, что каждая часть ПО промежуточного слоя будет взаимодействовать с другими частями.

ПО промежуточного слоя, которое отвечает за задачи самого низкого уровня, которые каждый бот должен быть добавлен в конвейер ПО промежуточного слоя. Например, ведение журнала, обработка исключений и перевод. Упорядочивайте их в зависимости от ваших потребностей, например, нужно ли сначала переводить входящие сообщения, перед сохранением сообщений или если хранилище сообщений должно происходить первым, что может означать, что сохраненные сообщения не будут переведены.

По промежуточному слоям для конкретного бота следует добавить в конвейер ПО промежуточного слоя последний раз, которое реализуется для выполнения некоторых действий по каждому сообщению, отправляемого боту. Если ПО промежуточного слоя использует информацию о состоянии или другую информацию, заданную в контексте бота, добавьте ее в конвейер программного обеспечения после того, как оно изменит состояние или контекст.

Сокращение каналов

Сокращение каналов — важный фактор работы ПО промежуточного слоя и обработчиков ответов. Если выполнение должно продолжаться через последующие слои, нужно, чтобы ПО промежуточного слоя (или обработчик ответов) передало данные выполнения, вызвав следующий делегат. Если следующий делегат не вызывается в этом ПО промежуточного слоя (или обработчике ответа), связанные с конвейером короткие цепи и последующие слои не выполняются. Это означает, что вся логика ботов и любое ПО промежуточного слоя, определенное далее в конвейере, пропускается. Существует небольшая разница между ПО промежуточного слоя и обработчиком ответа коротким замыканием поворота.

Когда ПО промежуточного слоя прерывает поворот, обработчик шагов бота не вызывается, но весь код ПО промежуточного слоя, выполняемый до этого момента в конвейере, по-прежнему будет выполняться до завершения.

Для обработчиков событий не вызывается следующее означает, что событие отменено, что очень отличается от логики пропуска ПО промежуточного слоя. Не обработав остальную часть события, адаптер никогда не отправит его.

Совет

Если вы сокращаете канал события ответа, например SendActivities, убедитесь, что такое поведение действительно требуется. Иначе возникнут трудности с исправлением этой ошибки.

Обработчики событий ответа

В дополнение к логике приложения и ПО промежуточного слоя в контекстный объект могут быть добавлены обработчики ответов (иногда называемые обработчиками событий или обработчиками событий активности). Эти обработчики вызываются, когда связанный ответ происходит в текущем объекте контекста перед выполнением фактического ответа. Эти обработчики полезны, когда вы знаете, что хотите сделать до или после фактического события по каждому действию этого типа для остальной части текущего ответа.

Предупреждение

Ни в коем случае не вызывайте метод ответа на действие из своего соответствующего обработчика событий ответа (например, вызвав из обработчика отправки действий метод отправки действия). Таким образом можно создать бесконечный цикл.

Как вы помните, каждое новое действие получает новый поток для выполнения. Когда создается поток для обработки действия, список обработчиков для этого действия копируется в этот новый поток. Если нет добавленных обработчиков, то после этой точки будет выполняться определенное действие. Обработчики, зарегистрированные в объекте контекста, обрабатываются аналогично тому, как адаптер управляет конвейером ПО промежуточного слоя. Обработчики вызываются в том порядке, в котором добавлены. При команде "Далее" делегат передает управление следующему зарегистрированному обработчику событий. Если обработчик не вызывает следующего делегата, ни один из последующих обработчиков событий не вызывается, замыкание событий и адаптер не отправляет ответ на канал.

Обработка состояний в ПО промежуточного слоя

Обычно для сохранения состояния в конце обработчика шагов выполняется вызов, сохраняющий изменения. Вот схема с фокусом на вызове.

Схема последовательности поворота бота с состоянием, сохраненным из обработчика шагов бота.

Проблема с этим подходом заключается в том, что любые обновления состояния, внесенные из некоторого пользовательского ПО промежуточного слоя, происходит после возврата обработчика шагов бота, не будут сохранены в устойчивом хранилище. Чтобы решить эту проблему, переместите вызов для сохранения изменений так, чтобы он выполнялся после пользовательского ПО промежуточного слоя. Для этого добавьте экземпляр auto-save changes в начало стека ПО промежуточного слоя или по меньшей мере до любых обращений к ПО промежуточного слоя, приводящих к изменению состояния. Такая реализация представлена в следующем примере.

Схема последовательности поворота бота с состоянием, сохраненным из ПО промежуточного слоя.

Добавьте объекты управления состоянием, которым потребуется обновлять объект набора состояний бота, и примените их при создании ПО промежуточного слоя для автоматического сохранения изменений.

Дополнительные ресурсы

Ознакомьтесь с реализацией ПО промежуточного слоя для ведения журнала расшифровки в пакете SDK Bot Framework [C# | JS].