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
Disabilitare automaticamente un workflow di GitHub (parte 2)
Cancellare una run di un workflow di GitHub
Filtering sulle colonne in una QuickGrid di Blazor
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Visualizzare le change sul plan di Terraform tramite le GitHub Actions
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Hosting di componenti WebAssembly in un'applicazione Blazor static
Ordine e importanza per @layer in CSS
Assegnare un valore di default a un parametro di una lambda in C#
Supportare il sorting di dati tabellari in Blazor con QuickGrid
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Usare il colore CSS per migliorare lo stile della pagina
I più letti di oggi
- Tutorial Entity Framework 6
- Tutorial Entity Framework
- Tutorial HTML5
- RT @aspitalia Partecipa al nostro evento #RCD4, fai un RT e sarai estratto per 1 copia di #sl3guidacompleta! http://u.aspitalia.com/bw
- Migliorare l'organizzazione delle risorse con Azure Policy
- Configurare più site su unico web role di Windows Azure
- Windows Phone 8 Developer Day - Milano
- ReBuild 2020 Live - Online
- ASPItalia.com Network: si aggiungono LINQItalia.com e SilverlightItalia.com
- Rilasciata la versione 1.0 di ASP.NET MVC