Implementare un delegato per il processore del feed di modifiche
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
}
};