Umbraco MemberService。在登录和获取操作期间保存了事件触发器

Umbraco MemberService。在登录和获取操作期间保存了事件触发器,umbraco,umbraco7,Umbraco,Umbraco7,我正在连接MemberService.Saved事件,以便在通过backoffice或自定义MVC表单更新成员详细信息时,使用ElasticSearch触发一些索引。我还想在添加新成员时执行此操作 问题是这个事件似乎被称为很多不同的时间;在调用MembershipHelper.Login和MembershipHelper.GetCurrentMemberProfileModel以及涉及MemberService的其他操作期间。不确定为什么每次访问成员时,Umbraco core都会执行保存操作,

我正在连接MemberService.Saved事件,以便在通过backoffice或自定义MVC表单更新成员详细信息时,使用ElasticSearch触发一些索引。我还想在添加新成员时执行此操作

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

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

问候


Ben

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

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

您可以使用IsNewEntity()扩展方法检查传递给已保存事件的成员对象是否是新的,如下所述:

如果成员对象不是新的,您可以迭代属性并检查是否只有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
                }
            }
        }
    }
}
公共类注册事件:ApplicationEventHandler
{
受保护的覆盖无效应用程序已启动(UmbracoApplicationBase umbracoApplication、ApplicationContext ApplicationContext)
{
MemberService.Saved+=MemberService\u Saved;
}
已保存无效成员服务(IMemberService发送方,Core.Events.SaveEventArgs e)
{
foreach(e.SavedEntities中的var成员)
{
if(member.IsNewEntity())
{
//这是一个全新的成员对象
//触发索引
}
其他的
{
var dirtyMember=(ICanBeDirty)成员;
var dirtyProperties=member.Properties.Where(x=>x.IsDirty()).ToList();
if(dirtyMember.IsDirty()| | dirtyProperty.Count()>1)
{
//多个属性或成员对象本身是脏的
//所以我们知道,改变的不仅仅是LastLoginDate
}
}
}
}
}

感谢您提供非常全面的回答当通过后台更改现有会员财产时,此选项不起作用。检查时,通过“if(dirtyMember.IsDirty())”行设置断点,member.\u propertyChangedInfo没有任何条目,即使我手动更改了属性。IsDirty()使用_propertyChangedInfo。我正在使用v7.1.2-我需要启用更改跟踪或类似的功能吗?不,应该可以。我可以让您在issues.umbraco.org上记录问题并引用此线程吗?通过这种方式,如果vLatest(目前为7.1.4)中仍然存在问题,我们可以为即将发布的修补程序修复它。