Ich habe eine Situation (ich vermute, ist ziemlich Standard), wo ich einige Geschäftsberechnungen durchführen und eine Reihe von Datensätzen in der Datenbank erstellen muss. Wenn irgendwas schief geht, muss ich alles aus der Datenbank zurückholen. Offensichtlich brauche ich irgendeine Art von Transaktion. Meine Frage ist, wo ich die Transaktionsunterstützung implementiere. Hier ist mein BeispielVerwenden von Transaktionen mit Geschäftsprozessen und das Repository-Muster
//BillingServices - This is my billing service layer. called from the UI
public Result GenerateBill(BillData obj)
{
//Validate BillData
//Create a receivable line item in the receivables ledger
BillingRepository.Save(receivableItem);
//Update account record to reflect new billing information
BillingRepository.Save(accountRecord);
//...do a some other stuff
BillingRepository.Save(moreStuffInTheDatabase);
}
Wenn eine der Updates der Datenbank fehlschlagen muss ich die anderen zurückrollen und raus. Muss ich aussetzen nur ein Connection-Objekt durch mein Repository, in dem ich
Connection.BeginTransaction() aufrufen können
oder mache ich, ich bestätigen nur in der Schicht Service und rufen nur eine Methode in das Repository, das alle spart die Objekte und behandelt die Transaktion? Das scheint mir nicht richtig zu sein. Es scheint, als würde es mich zwingen, in der Datenschicht zu viel Geschäftslogik zu machen.
Was ist der richtige Ansatz? Was ist, wenn ich Repositories überspannen muss (oder wäre das ein schlechtes Design)?
+1, gute Frage. –
Hoffentlich bekomme ich eine gute Antwort =). Eigentlich wäre jede Antwort zu diesem Zeitpunkt nett – Micah