Gestire dati temporali di gRPC in ASP.NET Core e C#

di Morgan Pizzini, in ASP.NET Core,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi