Track
/
C#
C#
/
Esercizi
/
ORM in un colpo solo
ORM in un colpo solo

ORM in un colpo solo

Esercizio di apprendimento

Introduzione

Ciclo di vita delle risorse

resource-cleanup usa l'interfaccia IDispose per segnalare che la risorsa di un oggetto, o un'altra parte dello stato del programma, doveva essere rilasciata o reimpostata quando l'oggetto non serviva più (e che affidarsi al garbage collector non l'avrebbe ottenuto né avrebbe fornito il livello di controllo richiesto), e che il metodo IDisposable.Dispose() era il posto naturale per questo tipo di operazioni di pulizia.

Esiste un'altra costruzione, il blocco using, che permette, dal punto di vista di chi chiama, di raccogliere in un'unica istruzione tutta la gestione del ciclo di vita delle risorse.

using (var file = new File("my_secrets"))
{
    file.WriteSecret("xxxxxxx");
}

Nell'esempio qui sopra, le risorse del file system associate a file vengono restituite al sistema operativo all'uscita dal blocco using.

Perché il meccanismo funzioni, la variabile nell'istruzione using deve essere un tipo di riferimento che implementa l'interfaccia IDisposable e deve rilasciare le risorse o reimpostare lo stato del programma nel suo metodo Dispose().

C# 8 introduce un perfezionamento di questo meccanismo. Un'istruzione using può essere collocata all'inizio di un blocco.

using var drawingResource = some_provided_or_new_object;
try
{
    drawingResource.DrawSomething();
}
catch (Exception)
{
    throw;
}

Gli sviluppatori Java potrebbero riconoscere in questo un analogo del meccanismo di gestione automatica delle risorse introdotto in Java 7.

Istruzioni

Sei di nuovo al lavoro sul sistema ORM (Object Relationship Mapping) introdotto in object-relational-mapping.

L'analisi sull'utilizzo del nostro ORM mostra che il 95% delle transazioni viene eseguito all'interno di un unico metodo chiamante, e si è deciso che sarebbe più appropriato avere un unico metodo ORM che aprisse, scrivesse e confermasse una transazione.

Il database ha i seguenti metodi di istanza:

  • Database.BeginTransaction() avvia una transazione sul database.
  • Database.Write(string data) scrive i dati sul database all'interno della transazione. Se riceve dati non validi viene lanciata un'eccezione. Un tentativo di chiamare questo metodo senza che sia stato chiamato BeginTransaction() provoca il lancio di un'eccezione. Se ha successo, lo stato interno del database passa a DataWritten.
  • Database.EndTransaction() conferma la transazione sul database. Può lanciare un'eccezione se non riesce a chiudere la transazione o se Database.BeginTransaction() non era stato chiamato.
  • Una chiamata a Database.Dispose() ripulisce il database se durante una transazione viene lanciata un'eccezione. Questo porta lo stato del database a Closed.

1. Scrivi sul database

Implementa il metodo Orm.Write() per avviare una transazione sul database, scrivere i dati ricevuti e confermare la transazione. Tutte le eccezioni, compresa InvalidOperationException, devono poter essere propagate al chiamante senza registrarle in un log né intervenire in alcun altro modo.

Database db = new Database();
Orm orm = new Orm(db);
orm.Write("good write");
// => database has an internal state of State.Closed
orm.Write("bad write");
// => an exception is thrown but database is left with an internal state of State.Closed
orm.Write("bad commit");
// => an exception is thrown but database is left with an internal state of State.Closed

2. Scrivi sul database e restituisci al chiamante un'indicazione sull'esito della scrittura

Sono passati alcuni mesi da quando è stato introdotto Orm.Write() e nel team c'è divisione. Molti sviluppatori vorrebbero che l'ORM gestisse gli errori quando viene lanciata un'eccezione e restituisse semplicemente al chiamante un'indicazione di successo.

Implementa il metodo Orm.WriteSafely() per avviare una transazione sul database, scrivere i dati ricevuti e confermare la transazione (come sopra). Dovrebbe restituire true se la scrittura è andata a buon fine, altrimenti false. Non cercare di registrare l'eccezione in un log.

Database db = new Database();
Orm orm = new Orm(db);
orm.WriteSafely("good write");
// => true
orm.WriteSafely("bad write");
// => false
orm.WriteSafely("bad commit");
// => false
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
C# Exercism

Vuoi iniziare ORM in un colpo solo?

Iscriviti a Exercism per imparare e padroneggiare C# con 62 concetti178 esercizi e il mentoring di persone reali, tutto gratis.