Tracks
/
C#
C#
/
Übungen
/
ORM in einem Rutsch
ORM in einem Rutsch

ORM in einem Rutsch

Lernübung

Einführung

Lebensdauer von Ressourcen

resource-cleanup verwendet die IDispose-Schnittstelle, um zu signalisieren, dass die Ressource eines Objekts oder ein anderer Programmzustand freigegeben oder zurückgesetzt werden muss, sobald das Objekt nicht mehr benötigt wird. Außerdem zeigt sie, dass man sich dabei nicht auf den Garbage Collector verlassen kann, weil dieser das entweder gar nicht erreicht oder nicht die nötige Kontrolle bietet. Die Methode IDisposable.Dispose() ist dann der natürliche Ort für solche Aufräumarbeiten.

Es gibt ein weiteres Konstrukt, den using-Block, mit dem sich aus Sicht des Aufrufers die gesamte Verwaltung der Lebensdauer von Ressourcen in einer einzigen Anweisung bündeln lässt.

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

Im obigen Beispiel werden die mit file verbundenen Dateisystemressourcen an das Betriebssystem zurückgegeben, sobald der using-Block verlassen wird.

Damit das Muster funktioniert, muss die Variable in der using-Anweisung ein Referenztyp sein, der die IDisposable-Schnittstelle implementiert und in seiner Dispose()-Methode Ressourcen freigibt beziehungsweise den Programmzustand zurücksetzt.

C# 8 führt eine Verfeinerung dieses Musters ein. Eine using-Anweisung kann an den Anfang eines Blocks gesetzt werden.

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

Java-Entwickler erkennen darin vielleicht ein Analogon zur automatischen Ressourcenverwaltung, die in Java 7 eingeführt wurde.

Anleitung

Du arbeitest wieder an dem ORM-System (objektrelationale Abbildung), das in object-relational-mapping vorgestellt wurde.

Unsere Analyse der ORM-Nutzung zeigt, dass 95 % der Transaktionen innerhalb einer einzigen aufrufenden Methode ausgeführt werden. Deshalb wurde entschieden, dass es passender wäre, eine einzige ORM-Methode zu haben, die eine Transaktion beginnt, Daten schreibt und die Transaktion committet.

Die Datenbank hat die folgenden Instanzmethoden:

  • Database.BeginTransaction() startet eine Transaktion auf der Datenbank.
  • Database.Write(string data) schreibt Daten innerhalb der Transaktion in die Datenbank. Wenn sie ungültige Daten erhält, wird eine Exception ausgelöst. Ein Aufruf dieser Methode, ohne dass vorher BeginTransaction() aufgerufen wurde, führt ebenfalls zu einer Exception. Bei Erfolg wechselt der interne Zustand der Datenbank zu DataWritten.
  • Database.EndTransaction() committet die Transaktion in die Datenbank. Sie kann eine Exception auslösen, wenn sie die Transaktion nicht abschließen kann oder wenn Database.BeginTransaction() nicht aufgerufen wurde.
  • Ein Aufruf von Database.Dispose() räumt die Datenbank auf, wenn während einer Transaktion eine Exception ausgelöst wird. Dadurch wechselt der Zustand der Datenbank zu Closed.

1. In die Datenbank schreiben

Implementiere die Methode Orm.Write(), um eine Datenbanktransaktion zu beginnen, die übergebenen Daten zu schreiben und die Transaktion zu committen. Alle Exceptions, auch InvalidOperationException, sollen ohne Protokollierung oder andere Eingriffe an den Aufrufer weitergegeben werden.

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. In die Datenbank schreiben und dem Aufrufer zurückmelden, ob der Schreibvorgang erfolgreich war

Es ist einige Monate her, seit Orm.Write() eingeführt wurde, und im Team herrscht Uneinigkeit. Viele Entwickler hätten es gern, dass die ORM Fehler behandelt, wenn Exceptions ausgelöst werden, und dem Aufrufer einfach eine Rückmeldung über den Erfolg gibt.

Bitte implementiere die Methode Orm.WriteSafely(), um eine Datenbanktransaktion zu beginnen, die übergebenen Daten zu schreiben und die Transaktion zu committen (wie oben). Sie soll true zurückgeben, wenn der Schreibvorgang erfolgreich war, andernfalls false. Versuche nicht, die Exception zu protokollieren.

Database db = new Database();
Orm orm = new Orm(db);
orm.WriteSafely("good write");
// => true
orm.WriteSafely("bad write");
// => false
orm.WriteSafely("bad commit");
// => false
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
C# Exercism

Bereit, mit ORM in einem Rutsch zu starten?

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