2012-10-02 8 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

あなたの応答に感謝します。 –

関連する問題