.net core 如何从Automapper配置文件获取用户标识
我有一个NetCore应用程序,需要获取当前用户令牌,以便使用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.
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更好。