Se una classe implementa l'interfaccia IDisposable, allora il suo metodo Dispose() deve essere chiamato ogni volta che un'istanza non è più necessaria. In genere, questo viene fatto da una clausola catch o finally, oppure dalla routine Dispose() di un chiamante. Dispose() offre l'opportunità di rilasciare risorse non gestite, come gli oggetti del sistema operativo (che non sono gestiti dal runtime .NET), e di reimpostare lo stato interno delle risorse gestite.
Implementerai un sistema ORM (Object Relational Mapping) su un database fornito da un altro team.
Il database è in grado di gestire una sola transazione alla volta.
In questa fase non sono richiesti il logging né altre forme di gestione degli errori.
Nota che, internamente, il database attraversa diversi stati: Closed, TransactionStarted, DataWritten, Invalid, Closed. Puoi contare sul fatto che all'inizio di ogni esercizio il database si trovi nello stato Closed.
Il database ha i seguenti metodi di istanza:
Database.BeginTransaction() avvia una transazione sul database. Se viene chiamato quando il database non si trova nello stato Closed, viene lanciata un'eccezione. Se l'operazione riesce, lo stato interno del database passerà a TransactionStarted.Database.Write(string data) scrive dei dati nel database all'interno della transazione. Se riceve dati non validi, viene lanciata un'eccezione. Se si tenta di chiamare questo metodo senza aver prima chiamato BeginTransaction(), viene lanciata un'eccezione. Se l'operazione riesce, lo stato interno del database passerà a DataWritten.Database.EndTransaction() esegue il commit della transazione sul database. Può lanciare un'eccezione se non riesce a chiudere la transazione o se Database.BeginTransaction() non era stato chiamato.Database.Dispose() ripulisce il database se durante una transazione viene lanciata un'eccezione. Questo porta lo stato del database a Closed.Allo stato del database si può accedere tramite database.DbState.
Lo stato del database può essere impostato su uno dei seguenti valori:
Implementa Orm.Begin() per avviare una transazione sul database. Se il database non parte con uno stato interno di State.Closed, viene lanciata un'InvalidOperationException.
var orm = new Orm(new Database());
orm.Begin();
// => database has an internal state of State.TransactionStarted
Implementa Orm.Write() per scrivere dei dati nel database. Se il database non parte con uno stato interno di State.TransactionStarted o se vengono scritti dati non validi, viene lanciata un'InvalidOperationException. Se la scrittura fallisce, l'Orm deve ripulire il database.
var orm = new Orm(new Database());
orm.Begin();
orm.Write("some data");
// => database has an internal state of State.DataWritten
orm.Write("bad write");
// => database has an internal state of State.Closed
Implementa Orm.Commit() per eseguire il commit dei dati. Se il commit fallisce, ripulisci il database. Se il database non parte con uno stato interno di State.DataWritten, viene lanciata un'InvalidOperationException.
var orm = new Orm(new Database());
orm.Begin();
orm.Write("some data");
orm.Commit();
// => database has an internal state of State.Closed
orm.Begin();
orm.Write("bad commit");
orm.Commit();
// => database has an internal state of State.Closed
Implementa l'interfaccia IDisposable sulla classe Orm. È garantito che la chiamata vada a buon fine.
var db = new Database();
var orm = new Orm(db);
orm.Begin();
orm.Write("some data");
orm.Dispose();
// => database has an internal state of State.Closed
Iscriviti a Exercism per imparare e padroneggiare C# con 62 concetti178 esercizi e il mentoring di persone reali, tutto gratis.