2013-06-13 16 views
6

Próbuję przenieść projekt, który używa dozer do orika.Jak skonfigurować Orika do mapowania klasy na inną w zależności od kontekstu?

W spycharki, jest to powszechna praktyka, aby mieć coś takiego:

<?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> 

a następnie użyć Mapid podczas konwersji obiektu:

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"); 

Więc moje pytanie brzmi: Jak skonfigurować Orika, żeby mieć takie mapy?

nie mogę znaleźć sposobu, aby zadeklarować MAP-id kiedy definiować moje mappers:

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

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

Odpowiedz

1

Szybka odpowiedź: nie ma wbudowanego wsparcia dla tej funkcji.

Ale z ważnego powodu, ponieważ zazwyczaj inny kontekst oznacza potrzebę tworzenia różnych klas (dobrze zdefiniowana odpowiedzialność). Drugi punkt znajduje się w głębokim wykresie obiektów Orika ponownie używa tych samych definicji mapy klas. Zatem kontekst może nie zależeć od przypadków mapy klas, ale na większej mapie graficznej.

Jeśli masz poważny przypadek użycia poza prostym "ponownym użyciem" tej samej klasy lub niektórych dobrze zdefiniowanych scenariuszy, zasugeruję, abyś użył dedykowanej MapperFactory na scenariusz.

Na przykład przy wystawianiu usług za pośrednictwem interfejsu API REST, metody GET (lista)/GET (szczegóły)/POST/PUT, możesz mieć dla każdego dedykowanego Mappera.

IMHO, w przypadku Entity and DTO ... DTO są umowami w celu nadania nazwy typowanemu krotce. Czy kontekstowe użycie tej samej klasy jest czymś, co prowadzi do wielu ukrytej wiedzy wokół kodu. Posiadanie konkretnej klasy dla każdego przypadku użycia jest (małym, ale ważnym) krokiem w kierunku dobrego projektu.

1

Możesz utworzyć wiele MapperFacades w Orianie i użyć odpowiedniego MapperFacade w każdym przypadku.

Inne podejście do używania niestandardowych maperów, w tym przypadku można przekazać coś w kontekście mapowania, sprawdzić ten parametr kontekstu i wykonać mapowanie w niestandardowych mapowaniach zgodnie z tą flagą.

Powiązane problemy