How to retrieved current published logged in member in generated model format

Hi,

I’m currently working on a login portal for users on an Umbraco V16 site. For this, I’m using Umbraco’s built-in member functionality.

However, I’ve added some custom fields to the member document type, and these are reflected in the generated Member model, which indirectly inherits from IPublishedContent.

I’ve now set up the following using the IMemberManager:

public async Task<Member?> GetCurrentPublishedMemberAsync()
{
    var identity = await _memberManager.GetCurrentMemberAsync();
    if (identity != null)
    {
        IPublishedContent? member = _memberManager.AsPublishedMember(identity);
        if (member != null)
        {
            if (member is Member castedMember)
                return castedMember;
        }
    }
    return null;
}

From what I remember, this setup used to work fine in V13, but unfortunately it no longer does.
Is there anyone who can help me with this?

It seems like the member is no longer of type Member.

Regards,
Joppe

Okay I think I found a solution

public class PublishedMembersAppService : IPublishedMembersAppService
{
    private readonly IMemberManager _memberManager;
    private readonly IMembersAppService _membersAppService;
    private readonly IPublishedModelFactory _modelFactory;

    public PublishedMembersAppService(IMemberManager memberManager, IMembersAppService membersAppService, IPublishedModelFactory modelFactory)
    {
        _memberManager = memberManager;
        _membersAppService = membersAppService;
        _modelFactory = modelFactory;
    }

    #region Public
    public async Task<Member?> GetCurrentPublishedMemberAsync()
    {
        var identity = await _memberManager.GetCurrentMemberAsync();
        if (identity != null)
        {
            IPublishedContent? member = _memberManager.AsPublishedMember(identity);
            if (member != null)
            {
                var typed = member.CreateModel(_modelFactory);
                if (typed is Member castedMember)
                {
                    return castedMember;
                }
            }
        }
        return null;
    }
    #endregion
}

But I dont think this is the best solution. Any other ideas?

Greetings,

Joppe