在 .NET 5 中将当前身份用户 ID 与 AutoMapper 结合使用
Use current Identity user ID with AutoMapper in .NET 5
我想知道如何在使用 Identity Framework 时访问 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
...
}
}
我希望能够从 AutoMapper 配置文件内部访问 ClaimsPrincipal
,例如:
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;
}
}
我想知道如何在使用 Identity Framework 时访问 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
...
}
}
我希望能够从 AutoMapper 配置文件内部访问 ClaimsPrincipal
,例如:
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;
}
}