使用Automapper填充新数据以及保留现有数据映射



我正在实现更新用户端点。在更新过程中,我正在获取原始实体。

public class UserEntity
{
public Guid Id { get; set; }
public Dictionary<string, IEnumerable<string>> Attributes { get; set; }
}
var user = await _userService.GetByIdAsync(request.Id);

然后我有一个更新请求

public class UpdateUserRequest
{
public string? MiddleName { get; set; }
public string? Phone { get; set; }
}

MiddleNamePhone应该作为属性存储在这里。

_mapper.Map(request, user);
CreateMap<UpdateUserRequest, UserEntity>().ForMember(dst => dst.Attributes, opt => opt.UseDestinationValue());

我使用目标值来保留原始属性,因为如果不是,它们将被清空。

我的解决方案是保留原始属性,并把新的有点脏,我的问题是:我可以处理它与Automapper的帮助?

我的解决方案:

void SetAttributes()
{
if(!string.IsNullOrEmpty(request.MiddleName))
{
if(!user.Attributes.TryGetValue(Constants.Attributes.MiddleName, out var middleName))
{
user.Attributes.Add(Constants.Attributes.MiddleName, new string[]
{
request.MiddleName
});
}
else
{
user.Attributes[Constants.Attributes.MiddleName] = new string[]
{
request.MiddleName
};
}
}
if(!string.IsNullOrEmpty(request.Phone))
{
if(!user.Attributes.TryGetValue(Constants.Attributes.PhoneNumber, out var firstName))
{
user.Attributes.Add(Constants.Attributes.PhoneNumber, new string[]
{
request.Phone
});
}
else
{
user.Attributes[Constants.Attributes.PhoneNumber] = new string[]
{
request.Phone
};
}
}
}

用自动制表器的AfterMap()方法算出来的。

.AfterMap((request, user) =>
{
if(!string.IsNullOrEmpty(request.FirstName))
{
user.FirstName = request.FirstName;
}
if(!string.IsNullOrEmpty(request.LastName))
{
user.LastName = request.LastName;
}
if(!string.IsNullOrEmpty(request.Email))
{
user.Email = request.Email;
}
if(!string.IsNullOrEmpty(request.MiddleName))
{
if(!user.Attributes.TryGetValue(KeycloakConstants.Attributes.MiddleName, out _))
{
user.Attributes.Add(KeycloakConstants.Attributes.MiddleName, new string[]
{
request.MiddleName
});
}
else
{
user.Attributes[KeycloakConstants.Attributes.MiddleName] = new string[]
{
request.MiddleName
};
}
}
if(!string.IsNullOrEmpty(request.Phone))
{
if(!user.Attributes.TryGetValue(KeycloakConstants.Attributes.PhoneNumber,
                      out _))
{
user.Attributes.Add(KeycloakConstants.Attributes.PhoneNumber, new string[]
{
request.Phone
});
}
else
{
user.Attributes[KeycloakConstants.Attributes.PhoneNumber] = new string[]
{
request.Phone
};
}
}
});

相关内容

  • 没有找到相关文章

最新更新