2012-10-02 74 views
13

我在玩弄試圖獲取使用RavenDB的應用程序框架。我已經建立了一個業務邏輯服務,它與會話具有1對1的關係,並且有效地成爲工作抽象的單元。RavenDB跟蹤更改繞過驗證

業務邏輯服務的一部分將包含所有驗證。從服務的方法可能是這樣的

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

的問題是,因爲用戶只要它被保存,我可以繞過商店方法的任何驗證,但後來存儲正確的值,然後改變它

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

    } 

有什麼方法讓RavenDB只存儲保存該項目的一個快照,而不是跟蹤進一步的變化?我是否應該克隆進出業務邏輯服務的所有內容以防止非法更新?或者我在錯誤的地方做驗證是否有更好的地方來放置這個邏輯?

回答

12

把你的驗證邏輯IDocumentStoreListener內的每個之前保存,可以自動做這種檢查。

我寫了更多關於這個問題here

+4

偉大的擴展點,它應該比目前對文檔有更多的宣傳 – Alex

+0

感謝您的回覆。 –