Tracks
/
C#
C#
/
Übungen
/
Objektrelationales Mapping
Objektrelationales Mapping

Objektrelationales Mapping

Lernübung

Einführung

Aufräumen von Ressourcen

Wenn eine Klasse das Interface IDisposable implementiert, muss ihre Dispose()-Methode immer dann aufgerufen werden, wenn eine Instanz nicht mehr benötigt wird. Das geschieht normalerweise in einer catch- oder finally-Klausel oder in der Dispose()-Routine eines Aufrufers. Dispose() bietet die Möglichkeit, nicht verwaltete Ressourcen wie Betriebssystemobjekte (die nicht von der .NET-Laufzeit verwaltet werden) freizugeben und den internen Zustand verwalteter Ressourcen zurückzusetzen.

Anleitung

Du implementierst ein ORM-System (Object Relational Mapping) über einer Datenbank, die ein anderes Team bereitgestellt hat.

Die Datenbank kann jeweils nur eine einzelne Transaktion verarbeiten.

Protokollierung oder eine andere Fehlerbehandlung ist in diesem Stadium nicht erforderlich.

Beachte, dass die Datenbank intern mehrere Zustände durchläuft: Closed, TransactionStarted, DataWritten, Invalid, Closed. Du kannst dich darauf verlassen, dass sich die Datenbank zu Beginn jeder Übung im Zustand Closed befindet.

Die Datenbank hat die folgenden Instanzmethoden:

  • Database.BeginTransaction() startet eine Transaktion auf der Datenbank. Wird diese Methode aufgerufen, während sich die Datenbank nicht im Zustand Closed befindet, wird eine Ausnahme ausgelöst. Bei Erfolg wechselt der interne Zustand der Datenbank zu TransactionStarted.
  • Database.Write(string data) schreibt Daten innerhalb der Transaktion in die Datenbank. Wenn sie fehlerhafte Daten erhält, wird eine Ausnahme ausgelöst. Der Versuch, diese Methode aufzurufen, ohne dass BeginTransaction() aufgerufen wurde, löst ebenfalls eine Ausnahme aus. Bei Erfolg wechselt der interne Zustand der Datenbank zu DataWritten.
  • Database.EndTransaction() schreibt die Transaktion in die Datenbank fest. Es kann eine Ausnahme auslösen, wenn die Transaktion nicht geschlossen werden kann oder wenn Database.BeginTransaction() nicht aufgerufen wurde.
  • Ein Aufruf von Database.Dispose() räumt die Datenbank auf, wenn während einer Transaktion eine Ausnahme ausgelöst wird. Dadurch wechselt der Zustand der Datenbank zu Closed.

Auf den Zustand der Datenbank kann mit database.DbState zugegriffen werden.

Der Zustand der Datenbank kann auf einen der folgenden Werte gesetzt werden:

  • TransactionStarted
  • DataWritten
  • Invalid
  • Closed

1. Eine Transaktion beginnen

Implementiere Orm.Begin(), um eine Transaktion auf der Datenbank zu starten. Wenn die Datenbank nicht mit einem internen Zustand von State.Closed startet, wird eine InvalidOperationException ausgelöst.

var orm = new Orm(new Database());
orm.Begin();
// => database has an internal state of State.TransactionStarted

2. Daten in die Datenbank schreiben

Implementiere Orm.Write(), um Daten in die Datenbank zu schreiben. Wenn die Datenbank nicht mit einem internen Zustand von State.TransactionStarted startet oder fehlerhafte Daten geschrieben werden, wird eine InvalidOperationException ausgelöst. Wenn das Schreiben fehlschlägt, muss das Orm die Datenbank aufräumen.

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. Zuvor geschriebene Daten in der Datenbank festschreiben

Implementiere Orm.Commit(), um die Daten festzuschreiben. Wenn das Festschreiben fehlschlägt, räume die Datenbank auf. Wenn die Datenbank nicht mit einem internen Zustand von State.DataWritten startet, wird eine InvalidOperationException ausgelöst.

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. Stelle sicher, dass die Datenbank korrekt aufgeräumt wird, wenn das ORM eine Transaktion vorzeitig schließen muss.

Implementiere das Interface IDisposable in der Klasse Orm. Der Aufruf ist garantiert erfolgreich.

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
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
C# Exercism

Bereit, mit Objektrelationales Mapping zu starten?

Melde dich bei Exercism an, um C# mit 62 Konzepte178 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.