2 Stimmen

List<Customer> alles oder nichts

Ich erstelle einen Webservice mit Windows Communication Foundation (WCF) und weiß derzeit nicht, wie ich die Validierung am besten durchführen kann.

Ich habe zwei Methoden: CreateCustomer(Customer) y CreateCustomers(List<Customer>) .

Wenn ein Kunde eine Liste von Kunden übergibt und einige der Kunden ungültig sind, sollte ich dann die gesamte Anfrage ablehnen? Oder sollte ich die Kunden zurückgeben, die die Validierung bestanden haben, und die ungültigen kennzeichnen?

Oder sollte ich ihnen nur erlauben, die CreateCustomer(Customer) und sie dazu bringen, sie wiederholt aufzurufen, wenn sie mehr als einen Kunden anlegen wollen?

2voto

Tom Anderson Punkte 10636

In dieser Art von Situation würde ich einen transaktionsähnlichen Ansatz empfehlen.

Grundsätzlich würden Sie alle überprüfen, wenn sie nicht bestehen, die Ausnahme oder andere Validierung fehlgeschlagene Ereignisse, mit dem Kunden (s), die nicht mit einem Bezeichner oder den tatsächlichen Objekten bestanden haben. Dies ermöglicht es der Person auf der anderen Seite der Pipeline, die Probleme zu identifizieren.

Für das Speichern in der Datenbank würde ich dies auch in einer Transaktion tun, teilweise speichern 1-7 Kunden, aber nicht die 8. könnte Probleme verursachen.

1voto

Jeremy Punkte 6410

Da Sie einen Webdienst entwickeln, möchten Sie wahrscheinlich die Anzahl der Hin- und Rückfahrten reduzieren. Das heißt, die Funktion CreateCustomers(list) loszuwerden, ist eine schlechte Idee.

Jetzt kommt der schwierige Teil. Ich würde vorschlagen, dass Sie es dem Kunden überlassen, wie er mit Fehlern umgehen möchte. Sie können die Signatur der CreateCustomers-Methode so ändern, dass sie ein bool enthält, das angibt, ob der Kunde alles oder nichts will. Etwa so: CreateCustomers(list, allOrNothing). Der Rückgabetyp für diese Operation sollte eine Liste von Objekten mit einer Eigenschaft für den Kunden und einem bool sein, der angibt, ob die Operation erfolgreich war oder nicht.

0voto

Alex Martelli Punkte 805329

Sie reduzieren den Hin- und Herverkehr, wenn Sie bei jedem Aufruf so viel Arbeit wie möglich erledigen. Daher scheint es gut zu sein, eine Liste zu akzeptieren und Fehler nur für die problematischen Fälle zurückzugeben (während die anderen verarbeitet werden). Die Ausnahme wäre natürlich für Arbeit, die atomar sein muss (alles oder nichts), aber im Sinne der Anwendungssemantik scheint das hier nicht der Fall zu sein.

0voto

Steven Evers Punkte 15926

Es ist Sache des Anbieters, Ihnen Daten zur Verfügung zu stellen, die mit dem Vertrag Ihres Webdienstes übereinstimmen. Wenn dies nicht der Fall ist, tun Sie dem Anbieter einen Gefallen, wenn Sie ihm sagen, welche Daten schlecht sind (zumindest im Vergleich zu allen APIs, gegen die ich in letzter Zeit entwickelt habe).

Die Annahme von Kunden, die gültig sind, und von solchen, die es nicht sind, könnte die Dinge noch mehr durcheinander bringen, wie in dieser Situation:

Ich erstelle eine Liste custs...; der Größe 100 und rufe Ihr CreateCustomers(custs) auf. 20 sind schlecht, aber Sie geben Auskunft darüber, warum. Es stellt sich heraus, dass mein Datenerfasser viele Tippfehler macht. Problem gelöst, ich versuche CreateCustomers(custs) erneut, aber ich erhalte die Fehlermeldung, dass 80 von ihnen bereits existieren. Haben Sie die 20, die korrigiert wurden, trotzdem angelegt (denn das haben Sie bei meiner letzten Datenübergabe getan)?

Ein großer Vorteil, wenn alle Transaktionen atomar sind, ist, dass man, wenn etwas nicht funktioniert, sicher weiß, dass sich der Zustand nach einer fehlgeschlagenen Operation nicht geändert hat.

0voto

David Yancey Punkte 1990

In dem von Ihnen beschriebenen Szenario kommt es darauf an, wie Sie die Fehler (faultcontract) in Ihrem WCF verwalten wollen.

Bei diesem Ansatz ist es erforderlich, einen Fehlervertrag zu erstellen, der lediglich besagt, dass bei einer oder mehreren Kundenanfragen ein Fehler aufgetreten ist.

Wenn Sie nicht mit diesem Ansatz zu gehen, dann werden Sie wahrscheinlich wollen, um Ihre datacontract / faultcontract in einer Weise, um jeden möglichen Fehler zu behandeln und unterscheiden zwischen ihnen für jeden Fehler in Ihrer Liste zu entwerfen. Außerdem müssen Sie dafür sorgen, dass doppelte Einträge auf dem Rückweg ordnungsgemäß behandelt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X