Implementare un delegato per il processore del feed di modifiche

Completato

In C#, un delegato è un tipo speciale di variabile o membro che fa riferimento a un metodo con un elenco di parametri e un tipo restituito specifici.

Per il processore del feed di modifiche, la libreria prevede un delegato di tipo ChangesHandler<> che accetta un tipo generico per rappresentare i singoli elementi serializzati. Il delegato include due parametri: un elenco di sola lettura delle modifiche e un token di annullamento.

È possibile creare un metodo denominato HandleChangesAsync con la stessa firma del metodo del delegato in una sintassi dettagliata.

static async Task HandleChangesAsync(
    IReadOnlyCollection<Product> changes,
    CancellationToken cancellationToken
) 
{
    // Do something with the batch of changes
}

Dopo averlo creato, è possibile creare una nuova variabile di tipo ChangesHandler<> e quindi fare riferimento al metodo precedente.

ChangesHandler<Product> changeHandlerDelegate = HandleChangesAsync;

Una sintassi ancora più sintetica che esegue la stessa operazione userebbe una funzione anonima anziché un membro del metodo denominato.

ChangesHandler<Product> changeHandlerDelegate = async (
    IReadOnlyCollection<Product> changes,
    CancellationToken cancellationToken
) => {
    // Do something with the batch of changes
};

All'interno del delegato è possibile eseguire l'iterazione dell'elenco delle modifiche e quindi implementare qualsiasi logica di business che abbia senso per l'applicazione. In questo esempio è possibile pensare a ogni modifica come a uno "snapshot" dell'elemento in un certo momento, che viene recapitato almeno una volta all'applicazione client host.

Viene usato un ciclo foreach per scorrere il batch corrente di modifiche e quindi ogni elemento viene stampato nella finestra della console.

ChangesHandler<Product> changeHandlerDelegate = async (
    IReadOnlyCollection<Product> changes,
    CancellationToken cancellationToken
) => {
    foreach(Product product in changes)
    {
        await Console.Out.WriteLineAsync($"Detected Operation:\t[{product.id}]\t{product.name}");
        // Do something with each change
    }
};