我正在连接MemberService。保存事件,以便在通过后台或自定义MVC表单更新成员详细信息时使用ElasticSearch触发一些索引。当添加新成员时,我也想这样做。
问题是这个事件似乎被调用了很多次;例如在调用membershihelper时。登录和会员帮助。GetCurrentMemberProfileModel和其他涉及MemberService的操作。不知道为什么Umbraco核心在每次访问成员时都会保存,但这会导致我的索引过程触发比必要的次数更多。
是否有更好的方法拦截成员上的插入/更新并触发我的索引过程?
亲切的问候本
MemberService.Saving
和MemberService.Saved
事件通常在LastLoginDate等内容更新时触发,这就是使用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
}
}
}
}
}