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のままです。ご協力いただきありがとうございます。