2013-06-13 33 views
6

Tôi đang cố di chuyển một dự án sử dụng dozer đến orika.Cách định cấu hình Orika để ánh xạ lớp này sang lớp khác tùy thuộc vào ngữ cảnh?

Trong dozer, đó là một thực tế phổ biến để có một cái gì đó như thế:

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

Và sau đó sử dụng mapId khi chuyển đổi các đối tượng:

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

Vì vậy, câu hỏi của tôi là: Làm thế nào để cấu hình Orika có những thứ mapId như thế?

tôi không thể tìm cách khai báo một bản đồ-id khi tôi xác định người vẽ bản đồ của tôi:

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

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

Trả lời

1

Câu trả lời nhanh chóng: không có built-in hỗ trợ cho tính năng này.

Nhưng vì lý do chính đáng, về cơ bản vì ngữ cảnh thường khác nhau có nghĩa là cần phải tạo các lớp khác nhau (trách nhiệm được xác định rõ). Điểm thứ hai là trong một đồ thị sâu của các đối tượng Orika tái sử dụng các định nghĩa tương tự của lớp-bản đồ. Vì vậy, bối cảnh có thể không phụ thuộc vào trường hợp của lớp-bản đồ nhưng trên cơ sở đồ thị lớn hơn bản đồ.

Khi bạn có trường hợp sử dụng nghiêm trọng ngoài việc "tái sử dụng" đơn giản của cùng một lớp hoặc một số trường hợp được xác định rõ, tôi sẽ đề nghị bạn sử dụng MapperFactory dành riêng cho mỗi trường hợp.

Ví dụ: khi hiển thị dịch vụ thông qua API REST, phương thức GET (danh sách)/GET (chi tiết)/POST/PUT, bạn có thể có cho từng công cụ, một Trình ánh xạ chuyên dụng.

IMHO, trong trường hợp Thực thể và DTO ... DTO là hợp đồng để đặt tên cho một tên được nhập. Việc sử dụng theo ngữ cảnh của cùng một lớp là điều dẫn đến nhiều kiến ​​thức ẩn xung quanh mã. Có một lớp cụ thể cho từng trường hợp sử dụng là một bước (nhỏ nhưng quan trọng) hướng tới thiết kế tốt.

1

Bạn có thể muốn tạo nhiều MapperFacades trong Orika và sử dụng MapperFacade phù hợp trong mỗi trường hợp.

Cách tiếp cận khác để sử dụng trình ánh xạ tùy chỉnh, trong trường hợp này bạn có thể chuyển nội dung trong bối cảnh ánh xạ, kiểm tra tham số ngữ cảnh này và thực hiện ánh xạ trong ánh xạ tùy chỉnh của bạn theo cờ đó.

Các vấn đề liên quan