如何从Automapper配置文件中获取用户身份

时间:2018-02-15 18:28:59

标签: .net-core token automapper

我有一个.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);

由于

1 个答案:

答案 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);
}

我不知道它是否是最佳解决方案,但它可以正常工作