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.
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.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:
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
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
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
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
Melde dich bei Exercism an, um C# mit 62 Konzepte178 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.