none
Frage zu Self-Tracking-Entities, Business-Klassen und Datenvalidierung RRS feed

  • Frage

  • Hallo

    ich bin gerade an einer Applikation mit Self-Tracking-Entities, und einer Business-Logik als eigener Layer. Jetzt mache ich mir gerade Gedanke zur Datenvalidierung - die ich als Teil der Business-Logik ansehe.

    Meine Frage stelle sich darin - wie kann ich die Valdierung am besten lösen, wenn ich jetzt zum Beispiel daran denke, die Business-Klassen in einer WinForm einzubinden. Bis jetzt verwendete ich die Validierung in der WinForm-Applikation so, dass ich ErrorProvider oder andere Komponenten dafür herangezogen habe.

    Wie kann ich es am besten angehen, wenn ich die Validierung in der Business-Klasse habe - aber die Fehler dann an einen ErrorProvider weiterleiten möchte; oder muss ich dann in der WinForm den ErrorProvider oder sonstige Validierungs-Methode wieder noch einmal implementieren....; oder ich denke auch an Datenübernahmen aus Schnittstellen, wo ebenfalls die Validierung der Business-Klasse zum Zug kommen könnte; oder auch die Anbindung an eine Web-Applikation.....

     Hat vielleicht hier im Forum jemand einen guten Rat für mich - oder gibt es ein Beispiel zu dieser genannten Anforderung ??

    Vielen Dank schon mal für eine Rückmeldung & schönen Gruß

    Michael

    Freitag, 30. Juli 2010 11:20

Alle Antworten

  • Ebenfalls hallo,

     

    das geht natürlich ;-)

    Implementiere IDataErrorInfo in deinen Entities. Dann kann man das mittles Binding und ErrorProvider sowohl in WinForms, WPF und ASP.Net benutzen.

    Kleines Beispiel: ObjectDatasource and IDataErrorInfo with WinForms

    Zusätzlich ein paar Tipps und Tricks: Entity Framework 4 Tips for WinForms Development

     

    Dann trotzdem eine Bemerkung zur Validierung. Auch wenn es viel Aufwendiger ist, trenne ich die Validierung des Business Objektes und die Validierung des GUI's.

    Warum: Die Validierung des BO's enthält oft "nur" Regeln, welche für die "innere Konsistenz" eines BO's wichtig sind. Sprich, sind die Daten in einem Zustand, in welchem sie serialisiert werden können. Ein GUI, und im speziellen wenn man mehrere GUI's hat, haben oft viel strengere Richtlinien. Diese sind eher auf den Userinput ausgelegt.

    Beispiel: Ein BO speichert eine EMail - Addresse. Die Regex zur Validierung im BO aktzeptiert alle möglichen Varianten einer Email Addresse. Nun im GUI will ich aber nicht, dass der User nur eine (formal) gültige Addresse eingibt, sondern meinetwegen eine Addresse ....@microsoft.com. Das muss in einem anderen GUI nicht gelten. etc. etc.

    Also das BO liefert nur eine Art "Grundvalidierung". Die spezifische muss halt das GUI noch draufpacken. Aber das ist wohl eher eine Luxusvariante.

    Viel Spass beim Validieren.

     

    Gruss

     

    Thomas

    Freitag, 30. Juli 2010 12:04
  • Hallo Thomas

    vielen Dank für Deine rasche Rückmeldung!!

    Dein Gedanke, die Validierung grundsätzlich zu trennen gefällt mir gut - den werde ich auf jeden Fall weiter fortsetzen. In den "BO's" Basis-Regeln.

    Für die spezifischen Validierungen - hast du da vielleicht noch eine Idee, oder schon Erfahrung ? Hier zum Beispiel eine Klasse für spezifische Validierungen zu bauen, die sich dann sowohl in WinForm-, Web- oder WPF-Applikationen wiederverwenden lässt - somit nicht mehr pro Applikation darauf geachtet werden muss / bzw. pro Applikation die immer extra implementiert werden muss............

    Danke & schönen Gruß

    Michael

     

    Freitag, 30. Juli 2010 13:36
  • Hallo Michael,

    Ja, IDataErrorInfo ist in diesem Kontext ein guter Ansatz. Nun eigenet sich Windows Forms nicht besonders für eine saubere Entkopplung Design-Logik, deswegen findest Du mehr Beispiel dafür in WPF/Silverlight Bereichen, aber gehen tut das natürlich auch. Die "0-8-15" Validierung à la: [Beispiel-Validierung] ist natürlich weiterhin möglich und kann hier mitbenutzt werden.
    Interessant für Dich sollte auch sein, dass eine solche Validierung etwa bei den "WCF RIA Services" quasi "out of the box" mit kommt.
    Man braucht im Prinzip nur noch attributiv/deklarativ angeben, wie Valierungs-Beschränkungen vorliegen. WCF-RIA ist eine enorm attraktive RAD Technologie (im fachlichen Sinne ;-), die extrem schnell implementiert werden kann. Sie ist auch im Kern technologie-unabhängig, das die Proxy-Generierung über T4 hergestellt wird.

           Du schriebst: "oder gibt es ein Beispiel zu dieser genannten Anforderung??"

    OK, nur mal zu IDataErrorInfo ein Beispiel und ein paar Hintergrund-Infos:

    [myCSharp.de - DIE C# und .NET Community | .NET-Komponenten und C#-Snippets | IDataErrorInfo im typisierten Dataset]
    http://www.mycsharp.de/wbb2/thread.php?threadid=63165

    Auch immer zu prüfen: der Einsatz der [Enterprise Library 5.0 -> The Validation Application Block]

    _________________

    da ich gerade sehe, dass auch "WinForm-, Web-, WPF-Apps" in einem wünschenswert sind, würde ich empfehlen insgesamt über das MVVM Pattern zu arbeiten. Ggf. ist PRISM hier ein guter Ansatz, auch, wenn hauptsächlich WPF/Silverlight das Ziel sind. Durch die Project-Linking Technik kann ggf. ein Multitargeting für alle Plattformen über eine App durchgweführt werden.


    ciao Frank
    Freitag, 30. Juli 2010 13:40
  • Hallo Michael,

    wegen den spezifischen Validierungen: Viele Teams die WinForms GUI's entwicklen haben zusätzlich eine (kostenpflichtige) Control Library im Einsatz. Z.b. DevExpress, Infragistics und wie sie alle heissen. Diese bringen üblicherweise schon einen Mechnismus dafür mit.

    Falls du das aber nicht im Einsatz hast, müsstest du auf ein Validierungsframework wie den Validation Application Block von patterns und practices oder Spring.Net zurückgreifen. Oder als ultimative Alternative nimmst du PostSharp und schreibst die entsprechenden Validierungs - Aspekte halt selber. Hab ich aber noch nie gemacht für WinForms.

    Da ich eher selten GUI's programmiere (echte Kerle schreiben den Core), bin ich da nicht so bewandert. Und ob's da wirklich was portables gibt (also für WinForms, WPF und ASP.NET), weiss isch ned.

     

    Schönes Wochenende

     

    Thomas

     

    Freitag, 30. Juli 2010 14:20
  • Hallo

    vielen Dank mal für die Informationen - Ich habe mir das einmal in Ruhe angesehen.....

    Eine Frage stellt sich mir jetzt aber noch - die im Zusammenhang mit den Self-Tracking-Entities-Klassen und einer Validierung eines Properties steht:
    Wenn ich zum Beispiel bei einer Entitäts-Klasse "Mitarbeiter" die Methode "OnChangingMailAdresse" habe in der ich eine gültige Mail-Adresse prüfe - dort wird eine Exception ausgelöst.......... wo soll ich diese in einer WinForm-Applikation abfragen/abfangen ?? Das ist mir noch ein Rätsel in Zusammenhang mit Validierungen und den Entitäts-Klassen.

    Bisher hatte ich im oben genannten Beispiel bei der "TextEditMitarbeiterMailAdresse" - den Validating-Event ausprogrammiert - und dort meine Validierungs-Routinen durchgeführt.

    Vielleicht kann mir hier nochmals auf die Sprünge geholfen werden.

    Danke & schönen Gruß

    Michael

    • Bearbeitet M.Erlinger Montag, 2. August 2010 14:39 Schreib-Fehler
    Montag, 2. August 2010 14:08
  • Hallo Michael,

    Bei On<Property>Changing darf/sollte IMHO kein direkter unbehandelter Fehler passieren.
    Ergo, IMHO mit try-catch abfangen und dann ggf. zu den Errors hinzufügen (Add). 
    Weiterhin - zum einen wäre die OnObjectStateChanging Methode des ObjectChangeTracker ja virtual - also überschreibbar, und zum anderen ist beim EF auch immer die Möglichkeit gegeben, das T4-Template (tt-Endung) anzupassen, was im Prinzip nicht schwer (und ja wie man im Artikel auch sieht, z.T. empfehlenswert) ist. Da müsstest Du im Prinzip nur folgendes im tt suchen:    Handle<#=edmProperty.Name#>Changing
    und gemäß Deinen Wünschen anpassen.

    Ansonsten vielleicht noch ein Link:

    [Best Practices - Data Annotations vs OnChanging in Entity Framework 4 - Stack Overflow]
    http://stackoverflow.com/questions/2762441/best-practices-data-annotations-vs-onchanging-in-entity-framework-4

     


    ciao Frank
    Dienstag, 3. August 2010 13:31
  • Hallo Frank

    Danke für Deine Rückmeldung und Info-Links.

    Das mit dem T4 hätte ich ja grundsätzlich schon getan; ich habe mir schon eine eigene BasisKlasse erstellt, und andere Ergänzungen im Template angepasst.....

    Mir fehlt aber irgendwie der Leitfaden, einen Fehler - der zum Beispiel im OnPropertyChanging() auftritt - weiterzureichen an die Applikation; sei es nun ein WinForm App. bei der der Benutzer Daten eingibt, oder sei es eine Schnittstellen App. bei automatisiert Daten gespeichert werden (sollen).

    Wie wäre es am sinnvollsten, Fehler aus einer Entitäts-Klasse zu sammeln (wenn überhaupt sammeln), und diese dann letztendlich an den Endverbraucher zurückzugeben; oder anders gefragt: wie bekommt zum Beispiel eine WinForm-Maske mit, dass im Entity.OnPropChanging() ein Fehler aufgetreten ist..............

    Vielleicht hast Du dazu noch ein paar Infos zur Verfügung - Danke schon mal & schönen Gruß

    Michael

     

     

     

     

    Montag, 9. August 2010 08:43