0

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

リスナーのコードは次のとおりです

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だけでなく、ドキュメントが保存されたときにPublicIdStoreListenerにヒットし、アプリケーションが例外をスローします。

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

編集 私はdocumentlistenerを次のように更新しました

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

更新 インスタンス化されたのと同じ行で、RegisterListenerを介してストアをアタッチできないことがわかりました。後で行う必要があります。そうしないと、渡されたときにストアがまだnullのままです。ご協力いただきありがとうございます。

4

1 に答える 1

2

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

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

また、私の理解では、変更を加えた場合はtrueを返し、変更を加えなかった場合はfalseを返す必要があります。これにより、エンティティを再シリアル化する必要があるかどうかが決まります。それが正しければ、全体が次のように再構築される可能性があります。

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
于 2012-04-25T15:27:55.937 に答える