如何在ASP.NET Core中根据AutoMapper中的用户角色有条件地映射/忽略属性

我正在使用AutoMapper.Extensions.microsoft.DependencyInjection 7.0.0

我只需要为具有特定角色的用户映射属性,否则在asp.net core 3.0项目中使用自动映射器忽略映射。

这是我尝试过的,

public class BranchProfile : Profile
{
    private readonly HttpContext _httpContext;

    public BranchProfile(IHttpContextaccessor httpContextaccessor)
    {
        _httpContext = httpContextaccessor.HttpContext;

        CreateMap<Branch,BranchEditViewModel>()
            .ForMember(dest => dest.Lock,opt => opt.Condition(src => _httpContext.User.IsInRole(UserRoles.Master.ToString())))
            .ForMember(dest => dest.Expireon,opt => opt.Condition(src => _httpContext.User.IsInRole(UserRoles.Master.ToString())));
    }
}

但是我得到以下无参数的构造函数异常。

  

没有为'BranchProfile'类型定义无参数构造函数

有没有更好的方法访问HttpContext来进行此条件映射?请协助

lwnxtb 回答:如何在ASP.NET Core中根据AutoMapper中的用户角色有条件地映射/忽略属性

这是我使用IMappingAction实现功能的方式。 IMappingAction支持DI,我注入了IHttpContextAccessor,并使用AfterMap根据用户角色来映射/拒绝(重置为原始值)映射。

映射配置文件:

public class BranchProfile : Profile
{
    public BranchProfile()
    {
        CreateMap<Branch,BranchEditViewModel>()
            .AfterMap<MapOnlyForMasterUserAction>();;
    }
}

IMappingAction:

public class MapOnlyForMasterUserAction : IMappingAction<BranchEditViewModel,Branch>
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public MapOnlyForMasterUserAction(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
    }

    public void Process(BranchEditViewModel source,Branch destination,ResolutionContext context)
    {
        if (_httpContextAccessor.HttpContext.User.IsInRole(IdentityEnums.UserRoles.Master.ToString()))
        {
            destination.Lock = source.Lock.ToString();
            destination.ExpireOn = source.ExpireOn.ToShortDateString();
        }
        else 
        {
            destination.Lock = destination.Lock;
            destination.ExpireOn = destination.ExpireOn;
        }
    }
}
本文链接:https://www.f2er.com/3140404.html

大家都在问