2013-06-13 2 views
6

Sto tentando di migrare un progetto che utilizza dozer a orika.Come configurare Orika per mappare una classe a un'altra in base al contesto?

In dozer, si tratta di una pratica comune per avere qualcosa di simile:

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

E quindi utilizzare il mapId quando si converte l'oggetto:

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

Quindi la mia domanda è: Come configurare Orika ad avere queste cose come la mappa?

non riesco a trovare il modo di dichiarare una mappa-id quando mi definisco i miei mapper:

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

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

risposta

1

La risposta più immediata: non c'è il supporto integrato per questa funzione.

Ma per una buona ragione, fondamentalmente perché in genere contesto diverso significa la necessità di creare classi diverse (responsabilità ben definita). Il secondo punto si trova all'interno di un grafico profondo di oggetti che riutilizzano le stesse definizioni di mappa di classe. Quindi il contesto potrebbe non dipendere da casi di mappa di classi, ma su una mappa di grandi dimensioni.

Quando si ha un caso d'uso serio oltre il semplice "riutilizzo" della stessa classe o alcuni scenari ben definiti, suggerirò di utilizzare un MapperFactory dedicato per scenario.

Ad esempio quando si espongono servizi tramite un'API REST, i metodi GET (elenco)/GET (dettagli)/POST/PUT, si può avere per ciascuno, un Mapper dedicato.

IMHO, nel caso di Entity e DTO ... DTO sono contratti un modo per dare un nome a una tupla tipizzata. L'uso contestualizzato della stessa classe è qualcosa che porta a molte conoscenze nascoste sul codice. Avere una classe specifica per ogni caso d'uso è un (piccolo ma importante) passo verso il buon design.

1

È possibile creare più MapperFacade in Orika e utilizzare MapperFacade appropriato in ciascun caso.

Un altro approccio per utilizzare i mappatori personalizzati, in questo caso si sarebbe in grado di passare qualcosa nel contesto di mappatura, controllare questo parametro di contesto ed eseguire la mappatura nei propri mapping personalizzati in base a tale indicatore.