Как условно отобразить / игнорировать свойства на основе роли пользователя в AutoMapper в ядре asp.net - PullRequest
0 голосов
/ 08 ноября 2019

Я использую AutoMapper.Extensions.Microsoft.DependencyInjection 7.0.0

Мне нужно отобразить свойства только для пользователя с определенными ролями, иначе проигнорируйте отображение с помощью automapper в моем проекте 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, чтобы сделать это условное сопоставление? Пожалуйста, помогите

1 Ответ

0 голосов
/ 10 ноября 2019

Вот как я достиг функциональности, используя 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...