Come abbiamo visto nell'articolo precedente (https://www.aspitalia.com/articoli/asp.net-core5/grpc/usare-grpc-infrastruttura-nostri-servizi-web.aspx), la comunicazione gRPC basa i suoi principi sui file protobuf, che contengono la definizione dei servizi e delle classi di trasporto.
Molti tipi sono traducibili 1:1 con .NET Core, una stringa e un numero vengono tradotti in string e int, ma purtroppo non si può dire lo stesso per DateTime e TimeSpan. Infatti, utilizzando gRPC, avremo a che fare con Timestamp e Duration, entrambi provenienti da Google.Protobuf.WellKnownTypes.
La nostra prima preoccupazione, quando andremo a scrivere un servizio, sarà fare in modo che questi due tipi vengano convertiti in DateTime e TimeSpan, di modo che l'applicazione, le librerie e i dati non entrino in contatto con oggetti estranei al Common Type System.
TimeStamp e Duration hanno già extension method che permettono di convertire facilmente da TimeSpan e DateTime:
var timestamp = DateTime.Now.ToTimestamp(); var duration = TimeSpan.FromMinutes(10).ToDuration(); var datetime = timestamp.ToDateTime(); var timespan = duration.ToTimeSpan();
Come possiamo notare dal codice in alto, esistono anche i metodi per la conversione nella direzione opposta. Tuttavia, c'è un aspetto a cui dobbiamo prestare particolare attenzione, ossia la gestione dei null. Se infatti DateTime e TimeStamp in .NET Core sono value type, Timestamp e Duration sono invece reference type e come tali, possono assumere valore null.
Perché è importante? Perché i metodi ToDateTime e ToTimeSpan sono metodi d'istanza, e quindi se li invochiamo su una reference null otterremo una NullReferenceException.
Un modo semplice per ovviare a questo problema, è costruire degli appositi extension method:
public static class TemporalNullExtensions { // conversione e gestione null pointer Timestamp public static DateTime? ToNullableDateTime(this Timestamp timestamp) => timestamp?.ToDateTime() ?? null; // conversione e gestione null pointer Duration public static TimeSpan? ToNullableTimeSpan(this Duration duration) => duration?.ToTimeSpan() ?? null; }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Autenticazione con Minimal API di ASP.NET Core 6
Modificare una variabile d'ambiente di un deployment di Kubernetes
Eseguire task temporizzati tramite hosted service in ASP.NET Core
Reagire alle modifiche della configurazione di ASP.NET Core
Ottimizzare le performance di serializzazione e deserializzazione JSON con System.Text.Json e i source generators
GitHub e .NET 6
Effettuare un loop di una GitHub Action
Introduzione a Azure Container Apps
Utilizzare le Promise in Javascript - prima parte
Un confronto tra React, Angular, Vue.js e Svelte: Form e validazione
Serializzare e deserializzare un tipo TimeOnly con System.Text.Json
Le regole da seguire per effettuare la migrazione a Bootstrap 5
I più letti di oggi
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Utilizzare il grid layout di Bootstrap 4 per creare colonne della stessa larghezza
- Applicare filtri alla telemetria di Application Insight con ASP.NET Core
- Gestire la cancellazione del testo della TextBox nella Universal Windows Platform
- SQL Server 2005 October Technical Preview
- Build Windows: segui con noi la diretta!
- Un ExpressionBuilder di ASP.NET per recuperare le immagini all'interno del tema corrente
- ci vediamo oggi dalle 14 per #aspilive: devConf 22 vi aspetta con tante sessioni!iscrizioni e live dalle 14 su => https://aspit.co/devconf-22