Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there something like AutoMapper for Scala?

I have been looking for some scala fluent API for mapping object-object, similar to AutoMapper. Are there such tools in Scala?

like image 202
mrcaramori Avatar asked Jul 30 '11 19:07

mrcaramori


People also ask

When should I use AutoMapper?

AutoMapper is used whenever there are many data properties for objects, and we need to map them between the object of source class to the object of destination class, Along with the knowledge of data structure and algorithms, a developer is required to have excellent development skills as well.

Is AutoMapper useful?

AutoMapper is a very popular . NET library for automatically mapping objects (e.g. database model to DTO). The mapping is done without having to write code to explicitly copy values over (except in cases where the mapping isn't obvious, such as where property names don't match or where transformations are necessary).

Who created AutoMapper?

In this episode, Shawn interviews Chief Architect and Headspring Fellow Jimmy Bogard about his long-running open source project AutoMapper. AutoMapper is a simple little library built to solve a deceptively complex problem—getting rid of code that mapped one object to another.


1 Answers

I think there's less need of something like AutoMapper in Scala, because if you use idiomatic Scala models are easier to write and manipulate and because you can define easily automatic flattening/projection using implicit conversions.

For example here is the equivalent in Scala of AutoMapper flattening example:

// 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: I should not use Double for money amounts...

like image 146
paradigmatic Avatar answered Oct 01 '22 23:10

paradigmatic