Tôi muốn chuyển đổi/ánh xạ một số đối tượng lớp "dữ liệu" thành các đối tượng lớp "dữ liệu" tương tự. Ví dụ, các lớp cho biểu mẫu web cho các lớp cho các bản ghi cơ sở dữ liệu.Cách tốt hơn để ánh xạ đối tượng dữ liệu Kotlin vào các đối tượng dữ liệu
data class PersonForm(
val firstName: String,
val lastName: String,
val age: Int,
// maybe many fields exist here like address, card number, etc.
val tel: String
)
// maps to ...
data class PersonRecord(
val name: String, // "${firstName} ${lastName}"
val age: Int, // copy of age
// maybe many fields exist here like address, card number, etc.
val tel: String // copy of tel
)
tôi sử dụng ModelMapper cho các công trình như vậy trong Java, nhưng nó không thể được sử dụng bởi vì các lớp dữ liệu cuối cùng (ModelMapper tạo cglib proxy để đọc định nghĩa bản đồ). Chúng ta có thể sử dụng ModelMapper khi chúng ta mở các lớp/trường này, nhưng chúng ta phải thực hiện các tính năng của lớp "dữ liệu" theo cách thủ công. (xem ví dụ về ModelMapper: https://github.com/jhalterman/modelmapper/blob/master/examples/src/main/java/org/modelmapper/gettingstarted/GettingStartedExample.java)
Cách ánh xạ các đối tượng "dữ liệu" như vậy trong Kotlin?
Cập nhật: ModelMapper tự động ánh xạ các trường có cùng tên (như tel -> tel) mà không khai báo ánh xạ. Tôi muốn làm điều đó với lớp dữ liệu của Kotlin.
Cập nhật: Mục đích của mỗi lớp phụ thuộc vào loại ứng dụng, nhưng chúng có thể được đặt trong lớp khác của ứng dụng.
Ví dụ:
- dữ liệu từ cơ sở dữ liệu (Database Entity) để dữ liệu cho dạng HTML (Model/Xem Model)
- REST của kết quả API để dữ liệu cho cơ sở dữ liệu
Các lớp học này tương tự, nhưng không giống nhau.
Tôi muốn tránh chức năng bình thường đòi hỏi những lý do sau:
- Nó phụ thuộc vào thứ tự của đối số. Một hàm cho một lớp có nhiều trường có cùng kiểu (như String) sẽ bị phá vỡ dễ dàng.
- Nhiều tuyên bố không cần thiết mặc dù hầu hết các ánh xạ có thể được giải quyết bằng quy ước đặt tên.
Tất nhiên, thư viện có tính năng tương tự được dự định, nhưng thông tin của tính năng Kotlin cũng được chào đón (như phát tán trong ECMAScript).
Vui lòng mô tả cách bạn muốn sử dụng các lớp được ánh xạ. Mục đích của việc có hai định dạng dữ liệu riêng biệt là gì? – voddan
Không bao giờ nghe nói về sao chép mô hình dữ liệu (ngoại trừ trường hợp mã kế thừa). Thông thường, dữ liệu bạn đang làm việc với (Xem mô hình) ** là ** dữ liệu bạn đưa vào cơ sở dữ liệu. – voddan
@voddan một trường hợp sử dụng sẽ chỉ hiển thị các phần của mô hình miền cho người tiêu dùng API khác nhau. Có DTO riêng biệt cho mỗi _view_ của mô hình miền sạch hơn nhiều so với sử dụng tức là [JsonView] (http://fasterxml.github.io/jackson-annotations/javadoc/2.1.1/com/fasterxml/jackson/annotation/JsonView.html) IMHO – miensol