2012-10-02 8 views
13

Gram dookoła próbując uzyskać framework aplikacji, który używa RavenDB. Ustanowiłem usługę logiki biznesowej, która ma relację 1 do 1 z sesją i skutecznie staje się jednostką abstrakcji pracy.RavenDB śledził zmiany pomija sprawdzanie poprawności

Częścią usługi logiki biznesowej będzie kontrola wszystkich walidacji. Sposób z usługi może być coś jak

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); 
    } 

Problem jest, że ponieważ użytkownik jest śledzony tak szybko, jak jest on przechowywany mogę ominąć żadnej oceny metody przechowywania lecz przechowywania prawidłową wartość, a następnie zmieniając go później

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")); 

    } 

Czy jest jakiś sposób, aby RavenDB przechował tylko migawkę przechowywanego przedmiotu i nie śledzi dalszych zmian? Czy powinienem klonować wszystko, wchodząc i wychodząc z usługi logiki biznesowej, aby zapobiec nielegalnej aktualizacji? lub czy dokonuję walidacji w niewłaściwym miejscu, czy istnieje lepsze miejsce na umieszczenie tej logiki?

Odpowiedz

12

Przed każdą zapisem logikę walidacji należy umieścić wewnątrz IDocumentStoreListener, można to zrobić automatycznie.

Napisałem więcej informacji na temat tego numeru here.

+4

Doskonały punkt rozszerzenia, zasługuje na większą reklamę niż obecnie na dokumentacji – Alex

+0

Dzięki za odpowiedź. –

Powiązane problemy