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?
Antworten
Zu viele Anzeigen?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...
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)
Für komplexe Mappings kann man Java-basierte Mapper in Betracht ziehen, wie
- http://modelmapper.org/user-manual/property-mapping/#conditional-mapping
- http://github.com/smooks/smooks/tree/v1.5.1/smooks-examples/model-driven-basic-virtual/
- http://orika-mapper.github.io/orika-docs/advanced-mappings.html
Auf Scala-Objekte kann von Java aus zugegriffen werden:
- http://lampwww.epfl.ch/~michelou/scala/verwendung-von-skala-aus-java.html
- http://lampwww.epfl.ch/~michelou/Android/java-zu-scala.html
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