Versuchen Sie Catch in Repository

8

Keines der Beispiele, die ich für Repository-Muster betrachtet habe, beinhaltet jede Art von Fehlerbehandlung. Warum ist das? Sag zum Beispiel, ich habe das:

%Vor%

Eine Instanz, in der wir eine Einschränkung verletzen. Ich fange die DbUpdateException ... Wo würde diese Fehlerbehandlung live, wenn nicht im Repository selbst?

    
Code Jammr 06.04.2011, 03:32
quelle

2 Antworten

3

In den meisten Fällen muss sich ein Repository nicht um die Behandlung von Ausnahmen kümmern. Die Klassen, die die Repositorys konsumieren, sollten das handhaben. Warum würde in Ihrem Beispiel null zurückgegeben werden sollen, wenn ein Einfügefehler auftritt? Ist das nicht weniger klar als nur eine Ausnahme zu werfen?

Nehmen wir beispielsweise an, wir möchten einen Datensatz über das Repository einfügen und dann die neue ID ausdrucken. Nehmen Sie an, dass der Einsatz aus irgendeinem Grund fehlschlägt.

%Vor%

Nach dem Muster in Ihrer Frage erhalten Sie eine NullReference -Ausnahme in der zweiten Zeile, wenn% code_% fehlschlägt. Das ist ein bisschen seltsam. Es ist klarer, das Insert in der ersten Zeile zu sehen. Es ist auch besser, auf DbUpdateException zu zählen, wobei entweder immer eine gültige Instanz zurückgegeben oder eine Ausnahme ausgelöst wird.

    
rsbarro 06.04.2011, 03:56
quelle
9

In einem richtig entworfenen System sollten die Beschränkungen niemals verletzt werden können. Machen Sie Ihre Entitäten intelligenter: Verwenden Sie zum Beispiel keine automatischen, selbst implementierten Setter.

Das Repository ist nicht der Ort, um eine Datenvalidierung durchzuführen. Der richtige Ort ist:

  • Wenn Sie einfach "vertragliche" Einschränkungen überprüfen, z. "Quantity sollte eine nichtnegative Ganzzahl sein" oder "Übergeben Sie mir keinen Null-Kunden", fügen Sie die Logik in die Entität selbst ein (entweder Setter oder Konstruktor oder Mutationsmethoden).
  • Wenn Sie Geschäftslogik prüfen, legen Sie sie in spezialisierte Objekte (DDD-Spezifikationen, falls Sie es wünschen), die diese Logik abstrahieren.

Diese Ausnahmen sollten nur dann auftreten, wenn Sie Ihre unit Integrationstests ausführen und Sie einen Fehler erhalten, der anzeigt, dass Ihre Datenbankeinschränkungen nicht mit Ihrer Entität oder Ihrer Entität übereinstimmen falsch implementiert. Also solltest du definitiv nicht catch haben.

    
Domenic 06.04.2011 03:41
quelle