Mellanprogram
GÄLLER FÖR: SDK v4
Mellanprogram är helt enkelt en klass som finns mellan kortet och din robotlogik, som läggs till i adapterns mellanprogramsamling under initieringen. Med detta SDK kan du skriva egna mellanprogram eller lägga till mellanprogram som skapats av andra. Varje aktivitet som skickas in till eller ut från din robot går genom ditt mellanprogram.
Adaptern bearbetar och dirigerar inkommande aktiviteter via robotens mellanprogramspipeline till robotens logik och backar sedan ut igen. När respektive aktivitet skickas in och ut ur roboten kan varje mellanprogram inspektera eller agera baserat på aktiviteten, både före och efter robotlogiken körs.
Innan du hoppar in i mellanprogram är det viktigt att förstå robotar i allmänhet och hur de bearbetar aktiviteter.
Används för mellanprogram
Frågan kommer ofta upp: "När ska jag implementera åtgärder som mellanprogram jämfört med att använda min vanliga robotlogik?" Med mellanprogram får du extra möjligheter att interagera med användarnas konversationsflöde både före och efter att varje tur i konversationen har bearbetats. Med mellanprogram kan du också lagra och hämta information om konversationen och anropa ytterligare bearbetningslogik vid behov. Nedan visas några vanliga scenarier som visar var mellanprogram kan vara användbara.
Titta på eller agera på varje aktivitet
Det finns många situationer som kräver att din robot gör något på varje aktivitet, eller för varje aktivitet av en viss typ. Du kanske till exempel vill logga varje meddelandeaktivitet som roboten tar emot eller ge ett återställningssvar om roboten inte på annat sätt har genererat ett svar den här vändningen. Mellanprogram är en bra plats för sådana processer, med dess förmåga att agera både före och efter att resten av robotlogik har körts.
Ändra eller förbättra turkontexten
Vissa konversationer kan vara mycket mer givande om roboten har mer information än vad som anges i aktiviteten. Mellanprogram i det här fallet kan titta på informationen om konversationstillståndet som den har hittills, fråga en extern datakälla och lägga till den i turn-kontextobjektet innan körningen överförs till robotlogik.
SDK:t definierar loggning av mellanprogram som kan registrera inkommande och utgående aktiviteter, men du kan också definiera ditt eget mellanprogram.
Robotens pipeline för mellanprogram
För varje aktivitet anropar adaptern mellanprogram i den ordning som du lade till den. Adaptern skickar in kontextobjektet för svängen och ett nästa ombud, och mellanprogrammet anropar ombudet för att skicka kontrollen till nästa mellanprogram i pipelinen. Mellanprogram har också möjlighet att göra saker när nästa ombud returnerar innan du slutför metoden. Du kan tänka på det eftersom varje mellanprogramobjekt har den första och sista chansen att agera med avseende på mellanprogramsobjekten som följer det i pipelinen.
Exempel:
- First middleware-objektets turhanterare kör kod innan nästa anrop anropas.
- Det andra mellanprogramobjektets turhanterare kör kod innan nästa anropas.
- Robotens turhanterare kör och returnerar.
- Det andra mellanprogramobjektets turhanterare kör eventuell återstående kod innan den returneras.
- Det andra mellanprogramobjektets turhanterare kör kod innan nästa anropas.
- First middleware-objektets turhanterare kör eventuell återstående kod innan den returneras.
Om mellanprogrammet inte anropar nästa ombud anropar adaptern inte någon av efterföljande mellanprograms- eller robotvändarhanterare och pipelinens kortslutning.
När robotens pipeline för mellanprogram har slutförts är vändningen över och turkontexten hamnar utanför omfånget.
Mellanprogram eller roboten kan generera svar och registrera händelsehanterare för svar, men tänk på att svar hanteras i separata processer.
Ordningen på mellanprogram
Eftersom ordningen i vilken mellanprogram läggs till avgör i vilken ordning mellanprogrammet bearbetar en aktivitet är det viktigt att bestämma i vilken ordning mellanprogrammet ska läggas till.
Anteckning
Detta är avsett att ge dig ett vanligt mönster som fungerar för de flesta robotar, men tänk på hur varje mellanprogram interagerar med de andra för din situation.
Mellanprogram som tar hand om de uppgifter på lägsta nivån som ska läggas till i din pipeline för mellanprogram först. Exempel är loggning, undantagshantering och översättning. Beställ dessa beroende på dina behov, till exempel om du vill att det inkommande meddelandet ska översättas först, innan meddelanden lagras eller om meddelandelagringen ska ske först, vilket kan innebära att lagrade meddelanden inte översätts.
Robotspecifikt mellanprogram bör läggas till i din pipeline för mellanprogram sist, mellanprogram som du implementerar för att utföra viss bearbetning av varje meddelande som skickas till din robot. Om mellanprogrammet använder tillståndsinformation eller annan information i robotkontexten lägger du till den i pipelinen för mellanprogram efter mellanprogrammet som ändrar tillstånd eller kontext.
Kortslutning
En viktig idé kring mellanprogram och svarshanterare är kortslutning. Om körningen ska fortsätta genom de lager som följer den krävs mellanprogram (eller en svarshanterare) för att genomföra körningen genom att anropa nästa ombud. Om nästa ombud inte anropas i mellanprogrammet (eller svarshanteraren) körs inte de associerade pipeline-kortslutningarna och efterföljande lager. Det innebär att all robotlogik, och alla mellanprogram längre fram i pipelinen, hoppas över. Det finns en diskret skillnad mellan ditt mellanprogram och svarshanterarens kortslutning i en sväng.
När kortslutna mellanprogram går en sväng anropas inte robotens turhanterare, men all mellanprogramskod som körs före den här punkten i pipelinen körs fortfarande för att slutföras.
För händelsehanterare innebär inte anropet nästa att händelsen avbryts, vilket skiljer sig mycket från logiken för mellanprogramshopp. Genom att inte bearbeta resten av händelsen skickar adaptern den aldrig.
Tips
Om du utför en kortslutning av en svarshändelse, till exempel SendActivities
, kontrollerar du att det är det beteende som du har för avsikt. Annars kan det leda till svåra att åtgärda buggar.
Händelsehanterare för svar
Förutom logiken för program och mellanprogram kan svarshanterare (kallas även ibland händelsehanterare eller aktivitetshändelsehanterare) läggas till i kontextobjektet. Dessa hanterare anropas när det associerade svaret inträffar på det aktuella kontextobjektet innan det faktiska svaret körs. Dessa hanterare är användbara när du vet att du vill göra något, antingen före eller efter den faktiska händelsen, för varje aktivitet av den typen för resten av det aktuella svaret.
Varning
Var noga med att inte anropa en aktivitetssvarsmetod inifrån dess respektive svarshändelsehanterare, till exempel anropa metoden skicka aktivitet inifrån en aktivitetshanterare för skicka. Detta kan generera en oändlig loop.
Kom ihåg att varje ny aktivitet får en ny tråd att köra på. När tråden för att bearbeta aktiviteten skapas kopieras listan över hanterare för den aktiviteten till den nya tråden. Inga hanterare som läggs till efter den punkten kommer att köras för den specifika aktivitetshändelsen. De hanterare som är registrerade på ett kontextobjekt hanteras på samma sätt som adaptern hanterar pipelinen för mellanprogram. Nämligen anropas hanterare i den ordning de läggs till och när nästa ombud anropas skickas kontrollen till nästa registrerade händelsehanterare. Om en hanterare inte anropar nästa ombud anropas ingen av efterföljande händelsehanterare, händelsens kortslutning och adaptern skickar inte svaret till kanalen.
Hanteringstillstånd i mellanprogram
En vanlig metod för att spara tillstånd är att anropa metoden spara ändringar i slutet av turhanteraren. Här är ett diagram med fokus på anropet.
Problemet med den här metoden är att alla tillståndsuppdateringar som görs från vissa anpassade mellanprogram som inträffar när robotens turhanterare har returnerats inte sparas i beständig lagring. Lösningen är att flytta anropet till metoden spara ändringar till när det anpassade mellanprogrammet har slutförts genom att lägga till en instans av automatiskt spara ändringar mellanprogram i början av mellanprogramsstacken, eller åtminstone före något av mellanprogram som kan uppdatera tillstånd. Körningen visas nedan.
Lägg till tillståndshanteringsobjekt som behöver uppdateras till ett objekt för robottillståndsuppsättningen och använd sedan det när du skapar mellanprogrammet för automatisk sparande av ändringar.
Ytterligare resurser
Du kan ta en titt på mellanprogrammet för avskriftsloggningsmellanprogram, som implementerats i Bot Framework SDK [C# | JS].