2013-06-13 10 views
6

Ich versuche ein Projekt zu migrieren, das dozer zu orika verwendet.Wie konfiguriere ich Orika, um eine Klasse abhängig vom Kontext einer anderen zuzuordnen?

In Planierraupe, dann ist es eine gängige Praxis, so etwas zu haben:

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

Und dann die mapId zu verwenden, wenn das Objekt konvertieren:

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

Also meine Frage ist: So konfigurieren Orika, um solche mapId Dinge zu haben?

Ich kann nicht finden, wie man eine Karte-ID erklären, wenn ich meinen Mapper definieren:

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

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

Antwort

1

Die schnelle Antwort: Es gibt keine eingebaute Unterstützung für diese Funktion.

Aber aus einem guten Grund, im Grunde, weil in der Regel unterschiedliche Kontext bedeutet die Notwendigkeit, verschiedene Klassen (gut definierte Verantwortung) zu erstellen. Der zweite Punkt befindet sich innerhalb eines tiefen Graphen von Objekten. Orika verwendet dieselben Definitionen von Klassen-Maps. Daher hängt der Kontext möglicherweise nicht von Fällen der Klassenzuordnung ab, sondern von einer größeren Basisdiagrammkarte.

Wenn Sie einen ernsthaften Anwendungsfall haben, der über die einfache "Wiederverwendung" derselben Klasse oder einiger gut definierter Szenarien hinausgeht, empfehle ich Ihnen, eine dedizierte MapperFactory pro Szenario zu verwenden.

Wenn Sie beispielsweise Dienste über eine REST-API bereitstellen, die Methoden GET (list)/GET (details)/POST/PUT, können Sie für jeden einen dedizierten Mapper verwenden.

IMHO, im Falle von Entity und DTO ... DTO sind Verträge eine Möglichkeit, einem typisierten Tupel einen Namen zu geben. Kontextuelle Verwendung der gleichen Klasse ist etwas, das zu viel verborgenem Wissen über Code führt. Eine bestimmte Klasse für jeden Anwendungsfall ist ein (kleiner, aber wichtiger) Schritt in Richtung gutes Design.

1

Sie möchten möglicherweise mehrere MapperFacades in Orika erstellen und in jedem Fall die entsprechende MapperFacade verwenden.

Ein anderer Ansatz zur Verwendung von benutzerdefinierten Zuordnern, in diesem Fall könnten Sie etwas im Zuordnungskontext übergeben, diesen Kontextparameter überprüfen und die Zuordnung in Ihren benutzerdefinierten Zuordnungen entsprechend diesem Flag durchführen.