.net - 在 .NET 5 中将当前身份用户 ID 与 AutoMapper 一起使用
问题描述
我想知道在使用身份框架时如何访问 AutoMapper 中的当前用户 ID。
{
public class MovieDto
{
public int Id { get; set; }
public string Name { get; set; }
public bool HasLiked { get; set; } // indicates if the current has liked the movie
...
}
}
我希望能够ClaimsPrincipal
从 AutoMapper 配置文件内部访问,例如:
CreateMap<Movie, MovieDto>()
.ForMember(dst => dst.HasLiked, opt => opt.MapFrom(src =>
src.UserLike.Any(ul =>
ul.UserId == User.FindFirst(ClaimTypes.NameIdentifier)?.Value));
是否可以使用 AutoMapper 实现这一目标?
如果这不可能或未指明,我应该如何以可重用的方式在我的存储库中执行此类查询?
解决方案
在@LucianBargaoanu 发表评论后,我能够弄清楚如何正确地做到这一点,所以我决定回答以帮助其他人从.Net 开始:
创建一个currentUserId
来保存用户 ID。
public class AutoMapperProfiles : Profile
{
public AutoMapperProfiles()
{
string currentUserId = null;
CreateMap<Movie, MovieDto>()
.ForMember(dst => dst.HasLiked, opt => opt.MapFrom(src =>
src.UserLikes.Any(ul => ul.UserId == currentUserId)));
}
}
使用 AutoMapper 进行投影时,currentUserId
作为参数传递:
public async Task<MovieDto> GetMoviesdAsync(string userId)
{
return await _context.Movies
.ProjectTo<MovieDto>(_mapper.ConfigurationProvider, new { currentUserId = userId })
.ToListAsync();
}
而且,这就是我在控制器中获取 UserId 的方式:
[HttpGet]
public async Task<ActionResult<IEnumerable<MovieDto>>> GetMovies()
{
var userId = User.GetUserId();
return Ok(await _unitOfWork.AuctionRepository.GetMoviesdAsync(userId));
}
这是我用来获取 UserId 的扩展方法:
public static class ClaimsPrincipleExtension
{
public static string GetUserId(this ClaimsPrincipal user)
{
return user.FindFirst(ClaimTypes.NameIdentifier)?.Value;
}
}
推荐阅读
- c# - 如何使用另一个类的列表变量迭代循环?
- filezilla - 通过 FileZilla 将本地文件夹上传到 Storj 存储桶后,如何自动刷新远程列表?
- c# - 如何使用文件路径从 csproj 文件访问保存在 Azure dev ops 存储库中的文件?
- powerbi - 如何修复 Power BI M 查询中的错误“404”
- warnings - 警告:hazelcast 模式位置的名称不正确,使用默认值
- python - 如何为数据框的特定子集绘制图表
- ros - Frame.msg 不能与来自 cantools 的 db_decode 一起使用
- javascript - 全日历模式未显示
- reactjs - 在 Servlet 环境中部署 React 应用程序
- selenium - 在使用 Selenium 的嵌入式 hellosign 区域的警报窗口中单击“确定”按钮