20 Stimmen

Gibt es so etwas wie AutoMapper für Scala?

Ich habe für einige Scala fließende API für die Zuordnung von Objekt-Objekt, ähnlich wie gesucht AutoMapper . Gibt es solche Werkzeuge in Scala?

13voto

paradigmatic Punkte 39621

Ich denke, es gibt weniger Notwendigkeit von so etwas wie AutoMapper in Scala, weil, wenn Sie idiomatische Scala-Modelle sind einfacher zu schreiben und zu manipulieren, und weil Sie leicht automatische Flattening/Projektion mit impliziten Konvertierungen definieren können.

Zum Beispiel ist hier das Äquivalent in Scala von AutoMapper Beispiel für Abflachung :

// 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: Ich sollte Double nicht für Geldbeträge verwenden...

6voto

BFil Punkte 12766

Ich stimme @paradigmatic zu, es ist wahr, dass der Code mit Scala viel sauberer sein wird, aber manchmal kann man sich dabei ertappen, wie man zwischen Fallklassen mappt, die sehr ähnlich aussehen, und das ist nur eine Verschwendung von Tastenanschlägen.

Ich habe mit der Arbeit an einem Projekt begonnen, das sich mit diesen Problemen befasst; Sie finden es hier: https://github.com/bfil/scala-automapper

Es verwendet Makros, um die Zuordnungen für Sie zu erstellen.

Zurzeit kann es eine Fallklasse auf eine Teilmenge der ursprünglichen Fallklasse abbilden, es behandelt Optionale und optionale Felder sowie andere kleinere Dinge.

Ich versuche immer noch herauszufinden, wie man die API zur Unterstützung der Umbenennung oder Zuordnung bestimmter Felder mit benutzerdefinierter Logik zu entwerfen, jede Idee oder Input auf, dass wäre sehr hilfreich.

Es kann für einige einfache Fälle verwendet werden, und natürlich, wenn die Zuordnung sehr komplex wird, könnte es besser sein, die Zuordnung manuell zu definieren.

Die Bibliothek erlaubt auch die manuelle Definition von Mapping Typen zwischen Fallklassen in jedem Fall, der als impliziter Parameter für eine AutoMapping.map(sourceClass) o sourceClass.mapTo[TargetClass] método.

UPDATE

Ich habe soeben eine neue Version veröffentlicht, die Iterables und Maps handhabt und die Übergabe von dynamischen Mappings erlaubt (um z.B. Umbenennungen und benutzerdefinierte Logik zu unterstützen)

2voto

SemanticBeeng Punkte 848

Für komplexe Mappings kann man Java-basierte Mapper in Betracht ziehen, wie

Auf Scala-Objekte kann von Java aus zugegriffen werden:

Die Implementierung impliziter Konvertierungen für komplexe Objekte wäre mit deklarativen Mappings reibungsloser als mit handgefertigten Mappings.

Eine längere Liste finden Sie hier:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X