在登录和获取操作期间,Umbraco MemberService.Saved事件触发器

时间:2014-06-04 10:57:01

标签: umbraco umbraco7

挂钩到MemberService.Saved事件,只要通过后台或我们的自定义MVC表单更新成员详细信息,就可以使用ElasticSearch触发一些索引。我还希望在添加新成员时执行此操作。

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

是否有更好的方法可以拦截成员的插入/更新并触发我的索引过程?

亲切的问候

1 个答案:

答案 0 :(得分:3)

当更新LastLoginDate之类的内容时,通常会触发MemberService.SavingMemberService.Saved事件,这是使用MembershipHelper.Login时发生的情况。

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

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

如果成员对象不是新的,你可以迭代属性并检查是否只有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
                }
            }
        }
    }
}