2009-04-18 3 views
4

Ich habe eine ObjectDataSource in einer ASPX-Seite, die CRUD-Operationen von einer Business-Logik-Klasse aufruft. Wenn während dieser Vorgänge Ausnahmen auftreten, möchte ich die Benutzer über die Fehler informieren und sie protokollieren. Aber ich möchte eine klare Trennung zwischen meiner Geschäftslogik und Präsentationsschicht. Ich weiß, dass ausgewählte, eingefügte, aktualisierte, gelöschte Ereignisse einen Parameter vom Typ ObjectDataSourceStatusEventArgs bereitstellen, der eine Eigenschaft "Exception" für Ausnahmen enthält.Wie können ObjectDataSource-Ausnahmen am besten behandelt werden?

Sind Handler dieser Ereignisse der beste Ort, um die Ausnahmen für ObjectDataSource zu behandeln, oder gibt es einen besseren Weg? Sind bei der Exception-Eigenschaft der Ereignisparameterkette während der Operation alle Ausnahmen aufgetreten?

Kommentare oder Vorschläge sind willkommen,

Danke,

Cullen

Antwort

0

Wenn die Methoden in der Business-Logik-Schicht automatisch aufgerufen werden, würde ich diese Ereignisse verwenden.

Ich denke, der Zweck dieser Ereignisse ist, dass: um einen Fehler in einer benutzerdefinierten Weise zu zeigen.

Aber ich würde nicht automatisch die Methoden in meiner Logik-Ebene aufrufen. Stattdessen werde ich sie nach Code aufrufen und einen booleschen Wert zurückgeben, der anzeigt, ob die Operation erfolgreich ist.

So etwas wie dies, beim Einfügen/Aktualisieren einer Person:

if (Person.Save(data)) { 
    // show OK message 
} else { 
    // show error message 
} 

wo Person eine BAL-Klasse in Bezug auf die Person Data Access Layer-Klasse ist.

Hoffe diese Hilfe.

2

Wenn während einer CRUD-Operation, die von Ihrem Biz-Layer-Objekt ausgeführt wird, eine Ausnahme ausgelöst wird, sollte sie vom Biz-Objekt teilweise verarbeitet werden. Dies liegt daran, dass Sie möchten, dass das Feedback die Präsentationsschicht erreicht (und Sie den Fehler auch protokollieren möchten). Daher könnten Sie entweder:

a. Übergeben Sie die Ausnahme erneut, wie sie ist. Dadurch wird es auf Ihre Präsentations-Ebene übertragen.

b. Fügen Sie der Eigenschaft Data der Ausnahme ein Name-Wert-Datenpaar hinzu, und werfen Sie es dann erneut ab.

c. Wickeln Sie die ausgelöste Ausnahme in einen benutzerdefinierten Ausnahmetyp und werfen Sie diese aus.

Diese Ausnahme wird dann auf Ihre Object sprudelte und wird über die ObjectDataSourceStatusEventArgs.Exception Eigenschaft in der ausgewählten/Inserted/Deleted/aktualisierte Ereignishandler zur Verfügung. Sie sollten dann überprüfen, ob diese Eigenschaft Null ist. Wenn nicht, umschließt die ObjectDataSource Exceptions (ja, Plural!) In einem TargetInvocationException Wrapper, so dass Sie wahrscheinlich auf die InnerException bekommen müssen.

Dann könnten Sie die UI-Elemente ändern, um Benutzern die notwendige Rückmeldung zu geben, dass der Vorgang nicht erfolgreich abgeschlossen wurde. Außerdem müssen Sie die Eigenschaft ExceptionHandled auf True setzen, um zu verhindern, dass die Ausnahme bis zur Page-Ebene durchgebrannt wird.

Zum Protokollieren der Ausnahme, persönlich, würde ich den Fehler in beiden Schichten protokollieren - Biz Logic Layer und Presentation Layer.

+0

@Cerebrus: danke. –