2012-10-02 7 views
13

Ich spiele herum und versuche, ein Anwendungsframework zu bekommen, das RavenDB verwendet. Ich habe einen Geschäftslogikdienst eingerichtet, der eine 1: 1-Beziehung zu einer Sitzung hat und effektiv zur Einheit der Arbeitsabstraktion wird.RavenDB verfolgte Änderungen umgeht Validierung

Ein Teil des Geschäftslogikdienstes würde alle Validierungen enthalten. Ein Verfahren aus dem Dienst könnte so etwas wie

public void StoreUser(User user) 
    { 
     //Some validation logic 
     if(string.IsNullOrWhiteSpace(user.Name)) 
      throw new Exception("User name can not be empty"); 

     Session.Store(user); 
    } 

sein Das Problem ist, dass, weil Benutzer so schnell aufgespürt, wie sie gespeichert wird i auf dem Speicher-Methode jede Validierung umgehen kann, aber einen korrekten Wert speichert sie dann später

Wechsel
public void TestUserStore() 
    { 
     var u1 = new User() {Name = "John"}; 
     var u2 = new User() { Name = "Amy" }; 

     Service.StoreUser(u1); 
     u1.Name = null; //change is tracked and will persist on the next save changes 
     Service.StoreUser(u2); 
     Service.SaveChanges(); 

     //The following fails, as we have stored null as the name rather than "John" bypassing our validation 
     Assert.IsTrue(Service.AdhocQuery<User>().Any(u => u.Name == "John")); 

    } 

Gibt es eine Möglichkeit, RavenDB nur einen Snapshot des gespeicherten Elements zu speichern und keine weiteren Änderungen zu verfolgen? Sollte ich alles klonen, was in den Business Logic-Dienst hinein und hinaus geht, um illegales Update zu verhindern? Oder mache ich die Validierung an der falschen Stelle? Gibt es einen besseren Ort, um diese Logik umzusetzen?

Antwort

12

Setzen Sie Ihre Validierungslogik in eine vor jedem Speichern, können Sie diese Art der Überprüfung automatisch durchführen.

Ich blogge mehr über dieses Problem here.

+4

Großer Erweiterungspunkt, verdient mehr Publizität als es derzeit auf der Dokumentation – Alex

+0

Vielen Dank für Ihre Antwort. –