我有一个.NET Core应用程序,我需要获取当前用户令牌以使用Automapper映射对象。
这是我的NET Core 控制器:
public async Task<IActionResult> Add([FromBody] EnrollSkill request)
{
var model = _autoMapper.Map<Domain.Entities.UserSkill>(request);
var response = await _userService.AddSkillAsync(model);
return Ok();
}
请注意,我尝试将 EnrollSkill 视图模型映射到 UserSkill 域模型。
这是我的 EnrollSkill 类:
public class EnrollSkill
{
public string Id { get; set; } // Skill Id (not user Id)
public int KnowledgeLevel { get; set; }
public int Order { get; set; }
}
这是我的 UserSkill 类:
public class UserSkill : Base
{
public int KnowledgeLevel { get; set; }
public int Order { get; set; }
public DateTime CreatedDate { get; set; }
public string UserId { get; set; }
public User User { get; set; }
public string SkillId { get; set; }
public Skill Skill { get; set; }
}
在我的存储库服务中,我需要填充UserId来调用SaveChangesAsync()
此UserId存在于Controller中,因为我可以通过以下方式阅读用户声明:
User.Claims
现在,我在Automapper中有这个配置文件:
CreateMap<EnrollSkill, UserSkill>().
BeforeMap((from, to) =>
{
to.UserId = "12345"
});
但是,如何在Automapper中正确读取此值?什么是最好的方式?
我尝试使用名为SetUserId的方法在控制器中填充此UserId,但我认为这是一个错误的解决方案,因为我弄乱了我的域实体:
var model = _autoMapper.Map<Domain.Entities.UserSkill>(request).SetUserId(CurrentUserId);
由于
答案 0 :(得分:2)
我认为最好的解决方案是注入IHttpContextAccessor
在我的 Startup 类中,我通过扩展方法添加了Automapper服务,并通过了IHttpContextAccessor:
public static int TestMethod(int[][] matrix)
{
int sum = 0;
for( int column = 0; column < 4; column++ )
{
for( int row = 0; row < 3; row++ )
{
if ( matrix[row][column] != 0 )
{
sum += matrix[row][column];
}
else
{
break;
}
}
}
return sum;
}
现在,在我的扩展方法中,我将IHttpContextAccessor传递给我的Automapper配置文件:
services.AddAutomapperConfiguration(_serviceProvider.GetService<IHttpContextAccessor>());
最后,在我的个人资料中,我通过帮助程序获取用户ID,该帮助程序从IHttpContextAccessor读取用户声明
public static void AddAutomapperConfiguration(this IServiceCollection services,
IHttpContextAccessor httpContextAccessor)
{
var automapperConfig = new MapperConfiguration(configuration =>
{
configuration.AddProfile(new Profiles(httpContextAccessor));
});
var autoMapper = automapperConfig.CreateMapper();
services.AddSingleton(autoMapper);
}
我不知道它是否是最佳解决方案,但它可以正常工作