2013-06-13 2 views
6

dozer을 사용하는 프로젝트를 orika으로 마이그레이션하려고합니다.컨텍스트에 따라 클래스를 다른 클래스에 매핑하도록 Orika를 구성하는 방법은 무엇입니까?

<?xml version="1.0" encoding="UTF-8"?> 
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://dozer.sourceforge.net 
http://dozer.sourceforge.net/schema/beanmapping.xsd"> 
    <mapping map-id="all"> 
     <class-a>com.bnppa.cdj.dto.Source</class-a> 
     <class-b>com.bnppa.cdj.dto.Destination</class-b> 
     <field> 
      <a>id</a> 
      <b>id</b> 
     </field> 
     <field> 
      <a>someField</a> 
      <b>someField</b> 
     </field> 
    </mapping> 

    <mapping map-id="small"> 
     <class-a>com.bnppa.cdj.dto.Source</class-a> 
     <class-b>com.bnppa.cdj.dto.Destination</class-b> 
     <field> 
      <a>id</a> 
      <b>id</b> 
     </field> 
    </mapping> 
</mappings> 

를 그리고 객체 변환 할 때의 mapId를 사용하십시오 : 방법을 구성 할 수 :

Source s = ... 

List<String> mappingFiles = new ArrayList<String>(); 
mappingFiles.add("dozer/dozerMapping.xml"); 
mapper = new DozerBeanMapper(mappingFiles); 

Destination d = mapper.map(mySource, Destination.class, "small"); 

그래서 제 질문은이 도저에

, 그것은 그런 일을하는 것이 일반적이다 오리카, 그런 mapId 것들을 가지고 있나?

나는 내 매퍼를 정의 할 때지도-ID를 선언하는 방법을 찾을 수 없습니다 :

MapperFactory factory = new DefaultMapperFactory.Builder().build(); 

//Register a mapper 
factory.registerClassMap(factory.classMap(Source.class, Destination.class) 
     .field("id","id") 
     .field("someField", "someField") 
     .toClassMap()); 

답변

1

빠른 대답 :이 기능에 대한 내장 지원이 없습니다.

그러나 좋은 이유는 기본적으로 일반적으로 다른 상황이란 다른 클래스 (잘 정의 된 책임)를 만들 필요성을 의미하기 때문입니다. 두 번째 요점은 클래스 - 맵과 동일한 정의를 재사용하는 객체의 딥 그래프 내에 있습니다. 따라서 문맥은 클래스 - 맵의 경우에 의존하지 않고보다 큰 기본 그래프 - 맵에 의존 할 수있다.

동일한 클래스 또는 일부 잘 정의 된 시나리오의 단순한 "재사용"이상의 심각한 사용 사례가있는 경우 시나리오별로 전용 MapperFactory를 사용하도록 제안합니다.

예를 들어 REST API, GET (목록)/GET (세부 사항)/POST/PUT 메소드를 통해 서비스를 노출 할 때 각각에 대해 전용 Mapper를 가질 수 있습니다.

IMHO, Entity 및 DTO의 경우 ... DTO는 형식화 된 튜플에 이름을 부여하는 방식입니다. 상황에 맞게 같은 클래스를 사용하면 코드 주위에 많은 숨겨진 지식이 생깁니다. 각 유즈 케이스에 대해 특정 클래스를 갖는 것은 좋은 디자인을 향한 (작지만 중요한) 단계입니다.

1

Orika에서 여러 MapperFacades를 만들고 각각의 경우 적절한 MapperFacade를 사용할 수 있습니다.

사용자 지정 맵퍼를 사용하는 또 다른 방법은이 경우 매핑 컨텍스트에서 무언가를 전달하고이 컨텍스트 매개 변수를 확인한 다음 해당 플래그에 따라 사용자 지정 매핑에서 매핑을 수행 할 수 있습니다.