Track
/
C#
C#
/
Esercizi
/
Mappatura oggetto-relazionale
Mappatura oggetto-relazionale

Mappatura oggetto-relazionale

Esercizio di apprendimento

Introduzione

Pulizia delle risorse

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.

Istruzioni

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.
  • Una chiamata a 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:

  • TransactionStarted
  • DataWritten
  • Invalid
  • Closed

1. Inizia una transazione

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

2. Scrivi dei dati nel database

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

3. Esegui il commit dei dati scritti in precedenza nel database

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

4. Assicurati che il database venga ripulito correttamente se l'ORM deve chiudersi a metà di una transazione.

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
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
C# Exercism

Vuoi iniziare Mappatura oggetto-relazionale?

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