최근 흥미로운 점을 발견했는데, AutoMapper는 주로 Model을 DTO로 변환합니다. DTO는 도메인 개체의 동작이 프레젠테이션 계층에 과도하게 노출되지 않도록 데이터에 더 많은 관심을 기울이고 도메인 개체를 합리적으로 캡슐화합니다.
먼저 두 클래스 간의 매핑에 대한 몇 가지 예를 살펴보겠습니다.
먼저 Source와 DTOSource라는 두 클래스를 정의합니다.
public class Source { public int Id { get; set; } public string Content { get; set; } } public class DTOSource { public int Id { get; set; } public string Content { get; set; } }
Source와 DTOSource 필드는 AutoMapper를 통해 어떻게 변환되는지 살펴보겠습니다.
Mapper.Initialize(x=>{ x.CreateMap<Source,DTOSource>(); }); Source s = new Source{Id=1,Content="123"}; DTOSource dto = Mapper.Map<DTOSource>(s);
첫 번째 단계는 Source 인스턴스를 초기화한 후 실행 결과를 살펴보는 것입니다.
실행이 완료되면 dto에서 데이터와 이전에 초기화된 s의 데이터 s를 dto에 직접 복사하는 것과 같습니다. 이는 두 클래스의 필드 이름이 정확히 동일한 경우에 해당됩니다. 그러면 DTOSource의 필드 이름이 Source의 필드 이름과 다른 경우에는 어떻게 될까요? 실제로는 매우 간단합니다.
만 약간의 코드로 변경하면 됩니다.
DTOSource의 Content 필드 이름을 Desc로 변경합니다. 이때 매핑 관계를 설정할 때만 필드를 지정하면 됩니다.
1 Mapper.Initialize(x => { 2 x.CreateMap<Source, DTOSource>().ForMember(c=>c.Desc,q=> { 3 q.MapFrom(z => z.Content); 4 }); 5 });
보자 러닝 결과를 보면
결과가 이전 러닝 결과와 동일한 것을 확인할 수 있습니다.
그래서 두 개의 List를 매핑하는 방법은 실제로는 위의 코드와 거의 동일하며 마지막 단계만 수정하면 됩니다. 다음 코드에서 보듯이
Mapper.Initialize(x => { x.CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q => { q.MapFrom(z => z.Content); }); }); s.Add(new Source { Id = 1, Content = "123" }); var dto = Mapper.Map<List<DTOSource>>(s);
코드의 마지막 문장을 제외하면 나머지는 코드의 마지막 문장에서 대상 유형이 List41b38b92674a5da99941ae683e26df45로 변경된 점만 제외하면 거의 동일하다는 것을 알 수 있습니다. 실행 결과를 살펴보세요.
결과는 기대와 일치합니다.
실제 프로젝트에서 이러한 작성 방식은 확실히 요구 사항을 충족하지 않습니다. 일반적으로 Profile에서 상속되는 새 SourceProfile을 생성하기 위해 캡슐화가 수행됩니다.
1 public SourceProfile() 2 { 3 base.CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q => { 4 q.MapFrom(z => z.Content); 5 }); 6 }
모든 매핑 관계는 이 클래스에서 프로그램 내에서만 작성할 수 있습니다. 초기화시 한번만 호출해주세요:
1 Mapper.Initialize(x =>{ x.AddProfile<SourceProfile>(); });
블로거가 사용하는 AutoMapper 버전은 6.1.1.0 입니다. AutoMapper가 6.0버전에서 Profile에서 Configure를 제거했기 때문에 6.0버전 이하의 작성방법과 조금 다릅니다. 6.0 이하 버전은 :
public class SourceProfile : Profile { protected override void Configure() { CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q => { q.MapFrom(z => z.Content); }); } }
Profile을 상속받아 구성을 다시 작성하면 됩니다. 호출 방법은 위와 크게 다르지 않습니다. Mapper.Initialize에 하나 이상의 프로필을 추가할 수 있습니다.
MVC 프로젝트 애플리케이션에서 Mapper를 캡슐화할 수 있습니다. 클래스로 초기화하세요.
public static class AutoMapperForMvc { public static void Register() { Mapper.Initialize(x => { x.AddProfile<SourceProfile>(); }); } }
그런 다음 MVC 전역에 한 번 등록하세요.
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //注册 AutoMapperForMvc.Register(); } }
위 내용은 C#의 AutoMapper 애플리케이션 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!