Triggers maken en gebruiken met de SDK

Voltooid

De eigenschap Scripts in de klasse Microsoft.Azure.Cosmos.Container bevat een CreateTriggerAsync-methode die wordt gebruikt om een nieuwe pre/post-trigger te maken op basis van code.

Notitie

In de volgende set voorbeelden wordt ervan uitgegaan dat u al een containervariabele hebt gedefinieerd.

Een voorafgaande trigger maken

Begin met het maken van een tekenreeksvariabele met de definitie van uw pre-triggerfunctie in JavaScript.

string preTrigger = @"function addLabel() {
    var context = getContext();
    var request = context.getRequest();
    
    var pendingItem = request.getBody();

    if (!('label' in pendingItem))
        pendingItem['label'] = 'new';

    request.setBody(pendingItem);
}";

Tip

U kunt ook bestands-API's zoals System.IO.File gebruiken om een functie te lezen uit een *.js-bestand.

Maak nu een object van het type Microsoft.Azure.Cosmos.Scripts.TriggerProperties met de eigenschappen Id en Hoofdtekst ingesteld op respectievelijk de unieke id en inhoud van de trigger. Stel de eigenschap TriggerOperation in op TriggerOperation.Create voor dit voorbeeld en stel vervolgens de eigenschap TriggerType in op TriggerType.Pre.

TriggerProperties properties = new()
{
    Id = "addLabel",
    Body = preTrigger,
    TriggerOperation = TriggerOperation.Create,
    TriggerType = TriggerType.Pre
};

Roep de methode CreateTriggerAsync van de containervariabele aan om een nieuwe voortrigger te maken die wordt doorgegeven in de eerder samengestelde eigenschappen.

await container.Scripts.CreateTriggerAsync(properties);

Een navolgende trigger maken

Het maken van een post-trigger is bijna identiek aan het maken van een pre-trigger. Begin met het maken van een tekenreeksvariabele met de JavaScript-definitie van uw post-triggerfunctie.

string postTrigger = @"function createView() {
    var context = getContext();
    var container = context.getCollection();
    var response = context.getResponse();
    
    var createdItem = response.getBody();
    
    var viewItem = {
        sourceId: createdItem.id,
        categoryId: createdItem.categoryId,
        displayName: `${createdItem.name} [${createdItem.categoryName}]`
    };
 
    var accepted = container.createDocument(
        container.getSelfLink(),
        viewItem,
        (error, newItem) => {
            if (error) throw error;
        }
    );
    if (!accepted) return;
}";

Maak nu een object van het type Microsoft.Azure.Cosmos.Scripts.TriggerProperties dat bijna identiek is geconfigureerd met dezelfde configuratie die wordt gebruikt met de pretrigger met één belangrijk verschil. Stel de eigenschap TriggerType in op TriggerType.Post. Roep vervolgens de methode CreateTriggerAsync van de containervariabele aan om een nieuwe post-trigger te maken die de eerder samengestelde eigenschappen doorgeeft.

TriggerProperties properties = new()
{
    Id = "createView",
    Body = postTrigger,
    TriggerOperation = TriggerOperation.Create,
    TriggerType = TriggerType.Post
};

await container.Scripts.CreateTriggerAsync(properties);

Tip

In deze voorbeelden hebben we uitsluitend triggers gemaakt voor de maakbewerking . U kunt ook triggers maken voor andere bewerkingen in uw container.

Een trigger gebruiken in een bewerking

Nu de triggers zijn gedefinieerd en gemaakt in de container, kunt u deze gebruiken in een bewerking op dezelfde container.

Laten we een voorbeeld gebruiken waarin u een nieuw item in C# maakt met behulp van een anoniem type.

var newItem = new
{
    id = "caab0e5e-c037-48a4-a760-140497d19452",
    name = "Handlebar",
    categoryId = "e89a34d2-47ee-4da8-bcf6-10f552604b79",
    categoryName = "Accessories",
    price = 50
};

Voordat u de bewerking aanroept, maakt u een object van het type Microsoft.Azure.Cosmos.ItemRequestOptions. Configureer in dat optiesobject de eigenschappenlijsten PreTriggers en PostTriggers om de triggers op te nemen die u voor deze bewerking wilt inschakelen.

ItemRequestOptions options = new()
{
    PreTriggers = new List<string> { "addLabel" },
    PostTriggers = new List<string> { "createView" }
};

Notitie

Vergeet niet dat triggers niet automatisch worden uitgevoerd; ze moeten worden opgegeven voor elke databasebewerking waar u ze wilt uitvoeren.

Roep nu de methode CreateItemAsync aan van het containerobject dat het item doorgeeft dat moet worden gemaakt en het optiesobject.

await container.CreateItemAsync(newItem, requestOptions: options);

Als u ten slotte een query uitvoert op uw container, ziet u dat er twee dingen zijn gebeurd:

  1. De pretrigger heeft een labeleigenschap toegevoegd aan uw eerste item met een waarde van nieuw.

  2. De posttrigger heeft een tweede item gemaakt met een gerealiseerde weergave van uw gegevens.

[
  {
    "id": "caab0e5e-c037-48a4-a760-140497d19452",
    "name": "Handlebar",
    "categoryId": "e89a34d2-47ee-4da8-bcf6-10f552604b79",
    "categoryName": "Accessories",
    "price": 50,
    "label": "new"
  },
  {
    "id": "77875d1e-dac4-3b66-9f9c-ab6747d65952",
    "sourceId": "caab0e5e-c037-48a4-a760-140497d19452",
    "categoryId": "e89a34d2-47ee-4da8-bcf6-10f552604b79",
    "displayName": "Handlebar [Accessories]"
  }
]