我正在实现更新用户端点。在更新过程中,我正在获取原始实体。
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; }
}
MiddleName
和Phone
应该作为属性存储在这里。
_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
};
}
}
});