挂钩到MemberService.Saved事件,只要通过后台或我们的自定义MVC表单更新成员详细信息,就可以使用ElasticSearch触发一些索引。我还希望在添加新成员时执行此操作。
问题在于这个事件似乎被称为很多不同的时期;即在调用MembershipHelper.Login和MembershipHelper.GetCurrentMemberProfileModel以及涉及MemberService的其他操作期间。不确定为什么Umbraco核心每次访问一个成员时都会保存,但是它导致我的索引过程触发的次数超过了必要的次数。
是否有更好的方法可以拦截成员的插入/更新并触发我的索引过程?
亲切的问候
本
答案 0 :(得分:3)
当更新LastLoginDate之类的内容时,通常会触发MemberService.Saving
和MemberService.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
}
}
}
}
}