[C# MapSter] 순환참조 인 경우 맵핑하기
- C#/C# 문법
- 2022. 5. 15. 18:33
목적
- C# MapSter 를 이용하여 순환참조를 발생시키는 Entity 에 대해서 어떻게 맵핑을 진행하는지 예제를 통해 알아 보도록 하겠습니다.
예제 코드
- 아래와 같이, Entity, Dto를 추가하였습니다.
// Entity
public class Member
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Address { get; set; }
public string PhoneNumber { get; set; }
public Department Department { get; set; } // 이 부분 추가.
}
public class Department
{
public int Id { get; set; }
public string Name { get; set; }
public string Ddscription { get; set; }
public List<Member> Members { set; get; } // 이 부분 추가.
}
public class MemberDto
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string Address3 { get; set; }
public string Tel { get; set; }
public DepartmentDto Department { get; set; } // 이 부분 추가.
}
public class DepartmentDto
{
public int Id { get; set; }
public string Name { get; set; }
public string Ddscription { get; set; }
public List<MemberDto> Members { set; get; } // 이 부분 추가.
}
- 위와 같이 Dto, Entity를 변경해 주었고, 1:N 관계로 순환 참조 구조로 값을 채워 보겠습니다.
MemberDto memberDto = new()
{
Id = 99,
Address1 = "경기도",
Address2 = "수원시",
Address3 = "어딘가...",
Description = "테스트 데이터",
Name = "Test Name",
Tel = "010-0000-0303",
Department = new DepartmentDto()
{
Id = 99,
Name = "어느부서..",
Members = new List<MemberDto>()
},
};
memberDto.Department.Members.Add(memberDto);
- 다음으로 아래와 같이 TypeAdapterConfig에
PreserveReference(true)
를 지정해주어야 합니다.
TypeAdapterConfig<MemberDto, Member>
.NewConfig()
.PreserveReference(true);
- 전체 예제 코드입니다.
using Mapster;
Console.WriteLine($"MapSter Start!!");
// program.cs 위 예제 코드에서 아래 Config를 추가해 준다.
TypeAdapterConfig<MemberDto, Member>.NewConfig()
.AfterMapping((src, dest) => //MemberDto에서 Member로 변환하는 코드
{
dest.Address = $"{src.Address1}@@{src.Address2}@@{src.Address3}";
dest.PhoneNumber = src.Tel;
})
.PreserveReference(true);
TypeAdapterConfig<Member, MemberDto>.NewConfig()
.AfterMapping((src, dest) => //Member에서 MemberDto로 변환하는 코드
{
string[] split = src.Address.Split("@@");
dest.Address1 = split[0];
dest.Address2 = split[1];
dest.Address3 = split[2];
dest.Tel = src.PhoneNumber;
})
.PreserveReference(true);
MemberDto memberDto = new()
{
Id = 99,
Address1 = "경기도",
Address2 = "수원시",
Address3 = "어딘가...",
Description = "테스트 데이터",
Name = "Test Name",
Tel = "010-0000-0303",
Department = new DepartmentDto()
{
Id = 99,
Name = "어느부서..",
Members = new List<MemberDto>()
},
};
memberDto.Department.Members.Add(memberDto);
Member entity = memberDto.Adapt<Member>();
Console.WriteLine($"ID : {entity.Id}");
Console.WriteLine($"Address : {entity.Address}");
Console.WriteLine($"Name : {entity.Name}");
Console.WriteLine($"Description : {entity.Description}");
Console.WriteLine($"TelNumber : {entity.PhoneNumber}");
Console.WriteLine($"Department : {entity.Department.Name}");
// Entity
public class Member
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Address { get; set; }
public string PhoneNumber { get; set; }
public Department Department { get; set; } // 이 부분 추가.
}
public class Department
{
public int Id { get; set; }
public string Name { get; set; }
public string Ddscription { get; set; }
public List<Member> Members { set; get; } // 이 부분 추가.
}
public class MemberDto
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string Address3 { get; set; }
public string Tel { get; set; }
public DepartmentDto Department { get; set; } // 이 부분 추가.
}
public class DepartmentDto
{
public int Id { get; set; }
public string Name { get; set; }
public string Ddscription { get; set; }
public List<MemberDto> Members { set; get; } // 이 부분 추가.
}
실행 결과
- 실행 결과, 정상적으로 맵핑 되어 출력되는 것을 확인할 수 있습니다.
MapSter Start!!
ID : 99
Address : 경기도@@수원시@@어딘가...
Name : Test Name
Description : 테스트 데이터
TelNumber : 010-0000-0303
Department : 어느부서..
728x90
'C# > C# 문법' 카테고리의 다른 글
[C# 문법] 대리자 및 람다 식 (0) | 2022.05.21 |
---|---|
[C# 문법] C# List<T> Linq 중복 검사 하기 (0) | 2022.05.19 |
[C# MapSter] 맵핑 객체 내부의 프로퍼티가 서로 다른 경우 (0) | 2022.05.15 |
[C# 문법] C# JSON 데이터 Serialize, DeSerialize 하기 (0) | 2022.05.12 |
[C# 동시성 프로그래밍] 완료한 작업 반환 (0) | 2022.05.12 |
이 글을 공유하기