Dependency entered in automapper profile in .net kernel - IHttpContextAccessor returns null

Purpose: Insert IHttpContextAccessorautmapper as a dependency in the profile constructor

Why : I need to pass the current username as part of building one of my domain objects

Question The received user ID is always zero.

What do I still have?

Startup.cs

mc.AddProfile(new DtoToOtherProfile(new HttpContextAccessor()));

//OR

var mapperConfiguration = new MapperConfiguration(mc =>
        {
            IServiceProvider provider = services.BuildServiceProvider();
            mc.AddProfile(new DtoToOtherProfile(provider.GetService<IHttpContextAccessor>()));
        });

DtoToOtherProfile.cs

 public DtoToOtherProfile(IHttpContextAccessor httpContextAccessor)
    {
     _httpContextAccessor = httpContextAccessor;

     CreateMap<MyDto, MyOther>()
    .ConstructUsing(myDto => new myOther(myDto.prop1, myDto .prop2,  _httpContextAccessor.HttpContext.User.Identity.Name)); // the name is what i intend to pass
      // other mapping
    }

Controller.cs

  public async Task<IActionResult> Create([FromBody]MyDto model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        // save campaign
        var myOtherModel = _mapper.Map<MyOther>(model);
        // myOtherModel.UserName is always null 
       // rest
      }

Is something missing? Pointers please?

+4
source share
2 answers

, - IHttpContextAccessor Profile, IValueResolver IHttpContextAccessor. , httpcontext

StartUp.cs ConfigureServices

 services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
 services.AddAutoMapper();

public class MappingProfile : Profile
    {
        public MappingProfile()
        {
            CreateMap<QueryUniqueDto, QueryUnique>()
                .ForMember(s=>s.UserClaim,opt=>opt.ResolveUsing<IdentityResolver>());
        }
    }

IValueResolver

public class IdentityResolver : IValueResolver<QueryUniqueDto, QueryUnique, UserClaim>
  {
    private IHttpContextAccessor _httpContextAccessor;

    public IdentityResolver(IHttpContextAccessor httpContextAccessor) 
    {
      _httpContextAccessor = httpContextAccessor;
    }

    public UserClaim Resolve(QueryUniqueDto source, QueryUnique destination, UserClaim destMember, ResolutionContext context)
    {
        return Helper.GetClaimsFromUser(_httpContextAccessor.HttpContext?.User.Identity as ClaimsIdentity);
    }
  }

!!!

+4

, AutoMapper . , . singleton-scope. , , AutoMapper.

:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

IServiceProvider provider = services.BuildServiceProvider();

var mapperConfiguration = new MapperConfiguration(mc =>
{
    mc.AddProfile(new DtoToOtherProfile(provider.GetRequiredService<IHttpContextAccessor>()));
});

. .

+1

Source: https://habr.com/ru/post/1676106/


All Articles