AutoMapper에서 해시드를 사용하는 방법

14900 단어 csharpdotnet

해시드를 사용하는 이유는 무엇입니까?



Hashids은 숫자 Id를 문자열로 변환하는 데 도움이 됩니다. 이렇게 하면 API에서 데이터를 요청할 때 DB의 실제 ID 또는 관련 키를 숨겨서 앱을 좀 더 안전하게 만들 수 있습니다.

AutoMapper의 ValueConverter가 왜 유용한가요?



ValueConverter은 te.Map<TDestination>(source) 메서드 내에서 변환을 처리할 수 있으므로 변환 논리를 한 곳에만 배치할 수 있습니다.

모델




//Model of your data
public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int ClassEnrollmentId { get; set; }
}

//Data Transfer Object (DTO) for your client
public class StudentDto
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string ClassEnrollmentId { get; set; }
}


구성



너겟 패키지를 설치한 후:
  • Install-Package hashids.net
  • Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection

  • Program.cs에 다음 코드를 추가하여 종속성 주입과 함께 해시 및 AutoMapper를 사용합니다. Startup 클래스를 사용하려면 ConfigureServices 메서드에 넣어야 합니다.

    builder.Services.AddSingleton<IHashids>(_ => 
    new Hashids("this is my salt"));
    // Optional, you can set the length of the string 
    // new Hashids("this is my salt", [the number you want])
    
    builder.Services.AddAutoMapper(typeof(AutoMapperProfile));
    


    AutoMapper 프로필




    using AutoMapper; // To use the Profile class
    
    public class AutoMapperProfile: Profile
    {
        public AutoMapperProfile()
        {
            //This configuration convert the int property who saves Ids to hash string
            CreateMap<Student, StudentDto>()
                .ForMember(d => d.Id, opt => opt.ConvertUsing<HashFormatter, int>())
                .ForMember(d => d.ClassEnrollmentId, opt => opt.ConvertUsing<HashFormatter, int>());
    
    
            //This configuration makes the oposite from the above configuration
            CreateMap<StudentDto, Student>()
                .ForMember(d => d.Id, opt => opt.ConvertUsing<IntFromHash, string>())
                .ForMember(d => d.ClassEnrollmentId, opt => opt.ConvertUsing<IntFromHash, string>());
        }
    }
    


    변환 클래스




    using AutoMapper; //To use IValueConverter interface
    using HashidsNet; //To use IHashids interface
    
    public class HashFormatter : IValueConverter<int, string>
    {
        private readonly IHashids hashids;
    
        public HashFormatter(IHashids hashids)
        {
            this.hashids = hashids;
        }
    
        public string Convert(int source, ResolutionContext context)
        {
            return hashids.Encode(source);
        }
    }
    public class IntFromHash : IValueConverter<string, int>
    {
        private readonly IHashids hashids;
    
        public IntFromHash(IHashids hashids)
        {
            this.hashids = hashids;
        }
    
        public int Convert(string source, ResolutionContext context)
        {
            return hashids.DecodeSingle(source);
        }
    }
    


    사용 방법



    컨트롤러에서는 AutoMapper를 주입하고 이와 같이 .Map 메서드를 호출하기만 하면 됩니다.

    public class StudentstController : ControllerBase
    {
        private readonly IMapper mapper;
    
        public StudentstController(IMapper mapper)
        {
            this.mapper = mapper;
        }
    
        [HttpGet]
        public IActionResult Get()
        {
            //Summaries is the data as List<Student>
            return Ok(mapper.Map<List<StudentDto>>(Summaries));
        }
    }
    


    결과



    해시가 없는 데이터

    [
      {
        "id": 1,
        "name": "Juan",
        "classEnrollmentId": 2
      },
      {
        "id": 2,
        "name": "Pedro",
        "classEnrollmentId": 1
      }
    ]
    


    해시가 있는 데이터

    [
      {
        "id": "NV",
        "name": "Juan",
        "classEnrollmentId": "6m"
      },
      {
        "id": "6m",
        "name": "Pedro",
        "classEnrollmentId": "NV"
      }
    ]
    


    이 글을 읽어주셔서 감사합니다. 도움이 되었으면 합니다.

    좋은 웹페이지 즐겨찾기