Есть ли что-то вроде AutoMapper для Scala? - PullRequest
19 голосов
/ 30 июля 2011

Я искал некоторый свободный интерфейс scala для отображения объекта-объекта, похожий на AutoMapper .Есть ли такие инструменты в Scala?

Ответы [ 3 ]

12 голосов
/ 05 августа 2011

Я думаю, что меньше нужно что-то вроде AutoMapper в Scala, потому что, если вы используете идиоматические модели Scala, их легче писать и манипулировать, и потому что вы можете легко определить автоматическое выравнивание / проекцию с помощью неявных преобразований.

Например, вот эквивалент в Scala для AutoMapper Пример выравнивания :

// The full model

case class Order( customer: Customer, items: List[OrderLineItem]=List()) {
  def addItem( product: Product, quantity: Int ) = 
    copy( items = OrderLineItem(product,quantity)::items )
  def total = items.foldLeft(0.0){ _ + _.total }
}

case class Product( name: String, price: Double )

case class OrderLineItem( product: Product, quantity: Int ) {
  def total = quantity * product.price
}

case class Customer( name: String )

case class OrderDto( customerName: String, total: Double )


// The flattening conversion

object Mappings {
  implicit def order2OrderDto( order: Order ) = 
    OrderDto( order.customer.name, order.total )
}


//A working example

import Mappings._

val customer =  Customer( "George Costanza" )
val bosco = Product( "Bosco", 4.99 )
val order = Order( customer ).addItem( bosco, 15 )

val dto: OrderDto = order // automatic conversion at compile-time !

println( dto ) // prints: OrderDto(George Costanza,74.85000000000001)

PS: я не должен использовать Double для денежных сумм ...

5 голосов
/ 17 сентября 2015

Я согласен с @paradigmatic, это правда, что при использовании Scala код будет намного чище, но иногда вы можете найти себе соответствие между классами дел, которые выглядят очень похожими, и это просто пустая трата нажатий клавиш.

Я начал работать над проектом для решения проблем, вы можете найти его здесь: https://github.com/bfil/scala-automapper

Он использует макросы для генерации сопоставлений для вас.

В настоящее время он может отобразить класс case в подмножество исходного класса case, он обрабатывает необязательные и необязательные поля, а также другие второстепенные вещи.

Я все еще пытаюсь выяснить, как спроектировать API для поддержки переименования или сопоставления определенных полей с пользовательской логикой, любая идея или вводная информация по этому вопросу будет очень полезной.

Это может быть использовано для некоторых простых случаев прямо сейчас, и, конечно, если отображение становится очень сложным, может быть, лучше просто определить отображение вручную.

Библиотека также позволяет вручную определять типы Mapping между классами наблюдений в любом случае, который может быть предоставлен как неявный параметр для метода AutoMapping.map(sourceClass) или sourceClass.mapTo[TargetClass].

UPDATE

Я только что выпустил новую версию, которая обрабатывает Iterables, Maps и позволяет передавать динамические отображения (например, для поддержки переименования и пользовательской логики)

2 голосов
/ 27 декабря 2014

Для сложных отображений можно рассмотреть такие средства отображения на основе Java, как

Доступ к объектам Scala из Java:

Реализации неявных преобразований для сложных объектов были бы более плавными с декларативными отображениями, чем созданные вручную.

Найден более длинный список здесь:

http://www.javacodegeeks.com/2013/10/java-object-to-object-mapper.html

...