Meine täglichen Aufräumarbeiten

Refactoring

Für meine Projekte nutze ich NHibernate, um Daten in eine Datenbank zu persisitieren. Für Datenbankoperationen mit diesem Framework (also Save, Update, Delete) werden Transaktionen ausgeführt. Darum wird im Quellcode für jede dieser Aktionen ein Transaktions-Scope erstellt.
[gist id=5570591]

Bei dieser Implementierung stört mich die sich wiederholende Verwendung des using-Statements (siehe Zeilen 12-16 & 21-25), um eine Transaktion zu initialisieren.
? In meinen Augen ist das Code-Smell.
Darum habe ich mich dazu entschlossen diesen Aspekt in eine Methode auszulagern, der ich die Bezeichnung Commit gegeben habe. Sie übernimmt eine Datenbankoperation und führt diese innerhalb der Transaktion aus.
[gist id=5553681]

Die auszuführende Datenbankoperation kann als Lambda-Audruck an die Methode Commit übergeben werden (siehe Zeile 12ff).

Meiner Meinung nach wird der Quellcode dadurch kürzer, lesbarer und verständlicher, weil die Verwendung/Bezeichnung der Methode Commit deutlich macht, dass eine Transaktion verpflichtend ausgeführt wird.

Es freut mich, wenn euch dieser Code-Schnipsel weiterhilft.
Lasst mich wissen, wenn ich etwas verbessern kann.

Viele Grüße aus Leipzig
Gregor

Gregor

Gregor Woiwode ist Angestellter der heco GmbH, wo er als Sofwareentwickler und Trainer tätig ist. Sein Fokus liegt in der Erstellung von Webportalen mit dem .NET- und Angular-Framework. Von 2007 bis 2010 studierte er Telekommunikationsinformatik an der Hochschule für Telekommunikation in Leipzig und schloss den Studiengang als Bachelor of Engineering ab. Derzeit studiert er im Studiengang Wirtschaftsinformatik um die Auszeichnung Master of Science zu erhalten.

6 thoughts on “Meine täglichen Aufräumarbeiten

  1. Sieht gut aus. Als alternative, aber aus meiner Sicht eher schlechteren Lösung, gäbe es noch die Möglichkeit das Ganze in einem Aspekt z.B. mit PostSharp zu verpacken, sodass man Transaktionen per Deklaration z.B. auf Methoden setzen könnte.

  2. Ok, anschauen, kann man sich das ja mal.
    Ich persönlich kann es nicht einschätzen, weil ich mit PostSharp noch nichts gemacht habe.

    Ich melde mich wieder, wenn ich zu einem Ergebnis gekommen bin.

    Danke
    Gregor

  3. Macht natürlich dann Sinn, wenn du diese Logik noch an weiteren Stellen hättest, wo du das immer wieder benötigst, was vermutlich bei dir nicht der Fall ist.

    1. Du hast recht. So oft nutze ich das nicht. Allerdings hast du mich auf die Idee gebracht, dass ich mir AOP etwas genauer ansehe. Das wird der nächste Blog-Artikel.

      Danke!

  4. Neben der Lösung mit Postsharp kannst du auch z.B. Fody oder Afterthought verwenden. Ich sehe in deinem Beispiel aber ein viel gravierenderes Problem. Dieser Ansatz führt zu sogenanntem Micro-Managing von Transaktionen. Transaktionen sollte Businessoperationen umschliessen. Ein Save oder ein Update ist keine Businessoperation. Oft kommt es vor, dass man in einem Businessprozess mehrere Daten miteinander verändert. Diese sollte in einer Transaktion gemanaged werden und nicht in mehreren.

    1. Hallo Daniel,

      vielen Dank für deine Hinweise. Fody und Afterthought waren mir bis heute nicht bekannt.

      Deine Anmerkung bezüglich des Micro-Managements von Transaktionen ist ebenso wichtig, danke. Ich möchte nicht den Eindruck vermitteln, dass für jede Datenmanipulation eine Transaktion abgeschlossen werden muss.
      Das hier gezeigte Beispiel ist während der Entwicklung eines Datenimports aus mehreren Datenquellen entstanden, die ich miteinander verbinde. Dabei kommt es manchmal zu solch simplen Datenbankoperationen, die ich ein wenig refaktorisiert habe.

      Beste Grüße Leipzig
      Gregor

What do you think? Please leave a Comment below!