2013-06-13 32 views
6

我正在嘗試遷移使用dozerorika的項目。如何配置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> 

然後轉換對象時使用的azazaz:

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

簡單的回答:沒有此功能,沒有內置的支持。

但有一個很好的理由,基本上是因爲通常情況下不同的上下文意味着需要創建不同的類(定義明確的責任)。第二點是對象的深層圖表Orika重​​用了類映射的相同定義。所以上下文可能不依賴於類映射的情況,而是依賴於更大的基礎圖形圖。

當你有嚴重的用例超出簡單的「重用」相同的類或一些明確的方案,我會建議你使用每個場景的專用MapperFactory。

例如,當通過REST API,方法GET(list)/ GET(details)/ POST/PUT公開服務時,您可以爲每個人提供一個專用的Mapper。

恕我直言,在實體和DTO的情況下... DTO是合同給一個類型元組的名字的一種方式。使用相同類的上下文使用會導致圍繞代碼的許多隱藏知識。爲每個用例分配一個特定的類是邁向良好設計的一個(小而重要的)步驟。

1

您可能希望在Orika中創建多個MapperFacade,並在每種情況下使用適當的MapperFacade。

另一種使用自定義映射器的方法,在這種情況下,您將能夠在映射上下文中傳遞某些內容,檢查此上下文參數並根據該標誌在自定義映射中執行映射。

相關問題