.net core 如何从Automapper配置文件获取用户标识

.net core 如何从Automapper配置文件获取用户标识,.net-core,token,automapper,.net Core,Token,Automapper,我有一个NetCore应用程序,需要获取当前用户令牌,以便使用Automapper映射对象 这是我的网络核心控制器: public async Task<IActionResult> Add([FromBody] EnrollSkill request) { var model = _autoMapper.Map<Domain.Entities.UserSkill>(request); var response = await _userService.

我有一个NetCore应用程序,需要获取当前用户令牌,以便使用Automapper映射对象

这是我的网络核心控制器

public async Task<IActionResult> Add([FromBody] EnrollSkill request)
{
    var model = _autoMapper.Map<Domain.Entities.UserSkill>(request);

    var response = await _userService.AddSkillAsync(model);

    return Ok();
}
这是我的用户技能课程:

public class EnrollSkill
{
    public string Id { get; set; } // Skill Id (not user Id)
    public int KnowledgeLevel { get; set; }
    public int Order { get; set; }
}
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()

此用户ID存在于控制器中,因为我可以通过以下方式读取用户声明:

User.Claims
现在,我在Automapper中有一个配置文件:

CreateMap<EnrollSkill, UserSkill>().
    BeforeMap((from, to) =>
    {
        to.UserId = "12345"
    });
CreateMap()。
BeforeMap((从,到)=>
{
to.UserId=“12345”
});
但是,如何在Automapper中正确读取该值?最好的办法是什么

我试图用一个名为SetUserId的方法在控制器中填充这个UserId,但我认为这是一个错误的解决方案,因为我弄乱了我的域实体:

var model = _autoMapper.Map<Domain.Entities.UserSkill>(request).SetUserId(CurrentUserId);
var model=\u autoMapper.Map(请求).SetUserId(CurrentUserId);

谢谢

我认为最好的解决方案是注入IHttpContextAccessor

public class Profiles : Profile
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public Profiles(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;

        CreateMap<Models.User.EnrollSkill, UserSkill>()
            .AfterMap((src, dest) =>
            {
                dest.UserId = IdentityHelper.GetClaimValue(_httpContextAccessor, IdentityHelper.Claims.Id);
            });

    }
}
在我的启动类中,我通过扩展方法添加了Automapper服务,并传递了IHttpContextAccessor:

services.AddAutomapperConfiguration(_serviceProvider.GetService<IHttpContextAccessor>());
最后,在我的配置文件中我通过从IHttpContextAccessor读取用户声明的helper获取用户Id

public class Profiles : Profile
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public Profiles(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;

        CreateMap<Models.User.EnrollSkill, UserSkill>()
            .AfterMap((src, dest) =>
            {
                dest.UserId = IdentityHelper.GetClaimValue(_httpContextAccessor, IdentityHelper.Claims.Id);
            });

    }
}
公共类配置文件:配置文件
{
专用只读IHttpContextAccessor\u httpContextAccessor;
公共配置文件(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor=httpContextAccessor;
CreateMap()
.AfterMap((src,dest)=>
{
dest.UserId=IdentityHelper.GetClaimValue(_-httpContextAccessor,IdentityHelper.Claims.Id);
});
}
}

我不知道这是否是最好的解决方案,但它工作正常

我认为最好的解决方案是InjectIHTTPContextAccessor

public class Profiles : Profile
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public Profiles(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;

        CreateMap<Models.User.EnrollSkill, UserSkill>()
            .AfterMap((src, dest) =>
            {
                dest.UserId = IdentityHelper.GetClaimValue(_httpContextAccessor, IdentityHelper.Claims.Id);
            });

    }
}
在我的启动类中,我通过扩展方法添加了Automapper服务,并传递了IHttpContextAccessor:

services.AddAutomapperConfiguration(_serviceProvider.GetService<IHttpContextAccessor>());
最后,在我的配置文件中我通过从IHttpContextAccessor读取用户声明的helper获取用户Id

public class Profiles : Profile
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public Profiles(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;

        CreateMap<Models.User.EnrollSkill, UserSkill>()
            .AfterMap((src, dest) =>
            {
                dest.UserId = IdentityHelper.GetClaimValue(_httpContextAccessor, IdentityHelper.Claims.Id);
            });

    }
}
公共类配置文件:配置文件
{
专用只读IHttpContextAccessor\u httpContextAccessor;
公共配置文件(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor=httpContextAccessor;
CreateMap()
.AfterMap((src,dest)=>
{
dest.UserId=IdentityHelper.GetClaimValue(_-httpContextAccessor,IdentityHelper.Claims.Id);
});
}
}

我不知道这是否是最好的解决方案,但它工作正常

我已经得到了在Automapper配置文件中注入IHttpContextAccessor的近似解决方案,但我认为这并不优雅。。有什么建议吗?@LucianBargaoanu谢谢!但是这个解决方案强制我在每个mapI帖子中输入一个pass值,因为答案在这里:我在Automapper配置文件中得到了一个近似于注入IHttpContextAccessor的解决方案,但我认为这并不优雅。。有什么建议吗?@LucianBargaoanu谢谢!但此解决方案强制我在每个mapI发布此链接时都有一个pass值,因为答案如下:DI也有效,请参阅。此外,解析程序比AfterMap.DI更好,也可以工作,请参阅。此外,冲突解决程序比AfterMap更好。