2012-04-25 8 views
0

IDocumentStoreListenerを使用して、単純なモデルにオートインクリメントを追加しようとしています。私は、この機能の実装に関するドキュメントがかなり疎であることを発見しました(どのポインタも大いに評価されるでしょう)。私はthis blog postに従うことを試みてきましたが、期限が切れているようです。私はRavenDBとIDocumentStoreListener

store = new EmbeddableDocumentStore 
{ 
    RunInMemory = true 
} 
.RegisterListener(new AuditableEntityListener(() => "Test User")) 
.Initialize(); 

を実装しようとすると、私は「それはデリゲート型ではありませんので、はRaven.Client.IDocumentStoreを入力するラムダ式を変換できない」旨のビルドエラーを取得します。

が、私はこのコードを使用して構築するためにそれを得るために管理

store = new EmbeddableDocumentStore 
    { 
     RunInMemory = true 
    } 
    .RegisterListener(new AuditableEntityListener(store)) 
    .Initialize(); 

リスナーのためのコードは、私がアプリケーションを実行すると、それはPublicIdStoreListenerを打つ、しかし

public class PublicIdStoreListener : IDocumentStoreListener 
    { 

     HiLoKeyGenerator generator; 
     IDocumentStore store; 
     public PublicIdStoreListener(IDocumentStore store) 
     { 
      this.store = store; 
      generator = new HiLoKeyGenerator(store, "verifications", 1024); 
     } 

     public void AfterStore(string key, object entityInstance, RavenJObject metadata) 
     { 
      throw new NotImplementedException(); 
     } 

     public bool BeforeStore(string key, object entityInstance, RavenJObject metadata) 
     { 
      var verification = entityInstance as VerifyAccountModel; 
      if (verification.PublicId == "0") 
      { 
       verification.PublicId = generator.GenerateDocumentKey(store.Conventions, entityInstance); 
      } 
      return false; 
     } 
    } 

を以下のとおりであるとき、任意のVerifyAccountModelだけでなく、アプリケーションが格納されます。これにより、アプリケーションは例外をスローします。

実際にどのように実装されているのか混乱しているので、誰かが正しい方向に向けることができるのだろうかと思っていました。前もって感謝します。私は、次の

public bool BeforeStore(string key, object entityInstance, RavenJObject metadata) 
     { 

      if (entityInstance.GetType() == new VerifyAccountModel().GetType()) 
      { 
       var verification = entityInstance as VerifyAccountModel; 
       if (verification.PublicId == "0") 
       { 
        verification.PublicId = generator.GenerateDocumentKey(store.Conventions, entityInstance); 
       } 
      } 
      return true; 
     } 

UPDATE にdocumentlistenerを更新

EDIT は、私はそれがインスタンス化されているのと同じラインにRegisterListenerを経由して店舗を添付傾けることを考え出しました。後でそれを行う必要があります。そうでなければ、店舗は引き渡された時点でまだヌルです。ご協力いただきありがとうございます。

答えて

2

特定のタイプに対してのみ起動するリスナーを登録する方法があるかどうかはわかりませんが、コードを構造化してVerifyAccountModelのエンティティのみに構造化することはできます。

var verification = entityInstance as VerifyAccountModel; 
if (verification == null) 
    return false; // We can't do anything, just let it pass through 

また、私の理解では、変更を行う際には変更がなされなかった場合はfalseを、trueを返すべきであるということです。これは、エンティティを再直列化する必要があるかどうかを決定します。それが正しければ、すべてが次のように再構成されるかもしれません。

var verification = entityInstance as VerifyAccountModel; 
if (verification != null && verification.PublicId == "0") 
{ 
    verification.PublicId = generator.GenerateDocumentKey(store.Conventions, entityInstance); 
    return true; // change made, re-serialize 
} 

return false; // no change made 
+0

デビッド - **ラインそうRegisterListener(新しいAuditableEntityListener(()=> "テストユーザー"))**間違っていると私は使用して正しくのDocumentStoreするためにこれを追加してい** RegisterListener(新しいAuditableEntityListener(。。ストア))**? – jamesamuir

+0

はい、 'PublicIdStoreListener'コンストラクタは' IDocumentStore'を受け入れるように書かれています。 –

+0

あなたは 'PublicIdStoreListener'権利を使用していますか? 'AuditableEntityListener'はブログ投稿のコピー/ペーストから来ていますか? –