2

每当通过后台或我们的自定义 MVC 表单更新成员详细信息时,我都会连接到 MemberService.Saved 事件以使用 ElasticSearch 触发一些索引。添加新成员时,我也想这样做。

问题是这个事件似乎被调用了很多次。即在调用 MembershipHelper.Login 和 MembershipHelper.GetCurrentMemberProfileModel 以及其他涉及 MemberService 的操作期间。不知道为什么每次访问成员时 Umbraco 核心都会进行保存,但这会导致我的索引过程触发的次数超出了必要的次数。

有没有更好的方法来拦截成员的插入/更新并触发我的索引过程?

亲切的问候

4

1 回答 1

3

MemberService.Saving和事件通常在MemberService.Saved更新 LastLoginDate 之类的内容时触发,这就是您使用MembershipHelper.Login.

您可以做的是在继续索引过程之前检查某些属性并检查它们是否脏(意味着它们已被更改)。

您可以使用 IsNewEntity() 扩展方法检查传递给 Saved 事件的成员对象是否是新的,如下所述:http: //our.umbraco.org/documentation/Reference/Events-v6/determining-new-实体

如果成员对象不是新的,您可以迭代属性并检查是否只有 LastLoginDate 是脏的,在这种情况下,您可能不想触发索引器。

这是一个例子:

public class RegisterEvents : ApplicationEventHandler
{
    protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
    {
        MemberService.Saved += MemberService_Saved;
    }

    void MemberService_Saved(IMemberService sender, Core.Events.SaveEventArgs<IMember> e)
    {
        foreach (var member in e.SavedEntities)
        {
            if (member.IsNewEntity())
            {
                //This is a brand new member object
                //Trigger indexing
            }
            else
            {
                var dirtyMember = (ICanBeDirty) member;
                var dirtyProperties = member.Properties.Where(x => x.IsDirty()).ToList();
                if (dirtyMember.IsDirty() || dirtyProperties.Count() > 1)
                {
                    //More then one property or the member object itself is dirty
                    //so we know that its not only LastLoginDate that is changed
                }
            }
        }
    }
}
于 2014-07-03T14:30:40.550 回答