19

我一直在寻找一些用于映射对象对象的 scala fluent API,类似于AutoMapper。Scala中有这样的工具吗?

4

3 回答 3

12

我认为在 Scala 中不需要像 AutoMapper 这样的东西,因为如果你使用惯用的 Scala 模型更容易编写和操作,而且你可以使用隐式转换轻松定义自动展平/投影。

例如,这里是 AutoMapper 展平示例的 Scala 中的等价物:

// 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 用于金额...

于 2011-08-05T08:38:17.803 回答
6

我同意@paradigmatic,确实使用Scala 代码会更简洁,但有时您会发现自己在看起来非常相似的案例类之间进行映射,这只是浪费按键。

我已经开始着手一个项目来解决这些问题,你可以在这里找到它:https ://github.com/bfil/scala-automapper

它使用宏为您生成映射。

目前它可以将一个案例类映射到原始案例类的一个子集,它处理可选项、可选字段以及其他次要的事情。

我仍在尝试弄清楚如何设计 api 以支持使用自定义逻辑重命名或映射特定字段,任何想法或输入都会非常有帮助。

它现在可以用于一些简单的情况,当然如果映射变得非常复杂,手动定义映射可能会更好。

该库还允许Mapping在任何情况下手动定义案例类之间的类型,这些类型可以作为AutoMapping.map(sourceClass)sourceClass.mapTo[TargetClass]方法的隐式参数提供。

更新

我刚刚发布了一个新版本,它处理 Iterables、Maps 并允许传入动态映射(例如,支持重命名和自定义逻辑)

于 2015-09-17T09:06:43.153 回答
2

对于复杂的映射,可能需要考虑基于 Java 的映射器,例如

可以从 Java 访问 Scala 对象:

复杂对象的隐式转换的实现使用声明式映射比手工映射更平滑。

在这里找到更长的列表:

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

于 2014-12-27T13:44:09.950 回答