0

我正在尝试通过 IDocumentStoreListener 向简单模型添加自动增量。我发现有关此功能实现的文档相当稀少(任何指针将不胜感激)。我一直在尝试关注这篇博文,但它似乎已经过时了。当我尝试实施

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

我收到一个构建错误,指出“无法将 lambda 表达式转换为 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;
        }
    }

但是,当我运行应用程序时,它会在存储任何文档时命中 PublicIdStoreListener,而不仅仅是 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;
        }

更新 我发现我无法通过 RegisterListener 在实例化的同一行中附加商店。必须事后完成,否则传入时store仍然为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 回答