Есть ли что-то вроде AutoMapper для Scala?

17

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

    
задан mrcaramori 30.07.2011 в 21:36
источник
  • Во время поиска AutoMapper я столкнулся с этим сообщением SO: Automapper для Java? в котором упоминается несколько возможностей, включая Dozer. Не обязательно «Скала», но ... –  Dozer 30.07.2011 в 21:47
  • К этому времени кто-то, должно быть, уже начал разрабатывать один в Scala ... –  mrcaramori 02.08.2011 в 06:12
  • Ничего не существует для Scala, о которой я знаю. Я планирую написать API сопоставления свойств для ModelMapper, который лучше использует некоторые возможности Scala, но пока вы, безусловно, можете использовать ModelMapper, как и для Java. –  Jonathan 16.08.2011 в 23:37
  • Я на самом деле думаю о написании одного, так же, как более или менее полезная практика для макросов :-) –  sorencito 02.06.2013 в 11:26
  • Я разработал один некоторое время назад, которое выводит отображение во время компиляции: scalalandio.github.io/chimney –  Piotr Krzemiński 26.03.2018 в 18:51

3 ответа

12

Я думаю, что в Scala меньше нужно что-то вроде AutoMapper, потому что если вы используете идиоматические модели 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 для денежных сумм ...

    
ответ дан paradigmatic 05.08.2011 в 10:38
4

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

Я начал работу над проектом для решения проблем, вы можете найти его здесь: Ссылка

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

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

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

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

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

UPDATE

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

    
ответ дан BFil 17.09.2015 в 11:06
1

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

Объекты Scala могут быть доступны из Java:

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

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

Ссылка

    
ответ дан SemanticBeeng 27.12.2014 в 14:44