Szukałem jakiegoś scala płynnego API do mapowania obiektu-obiektu, podobnego do AutoMapper. Czy są takie narzędzia w Scali?Czy jest coś takiego jak AutoMapper dla Scala?
Odpowiedz
Wydaje mi się, że w Scali jest mniejsze zapotrzebowanie na coś takiego jak AutoMapper, ponieważ w przypadku korzystania z idiomatycznych modeli Scala łatwiej jest pisać i manipulować, a także można łatwo zdefiniować automatyczne spłaszczanie/rzutowanie przy użyciu niejawnych konwersji.
Na przykład tutaj jest równoważne Scala od 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 nie należy używać podwójnego dla kwoty pieniędzy ...
przypadku złożonych odwzorowań można rozważyć Java odwzorowujące jak
- 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
obiekty Scala można uzyskać z Java:
- http://lampwww.epfl.ch/~michelou/scala/using-scala-from-java.html
- http://lampwww.epfl.ch/~michelou/android/java-to-scala.html
Implementacje niejawne konwersje dla złożonych obiektów będzie gładsza z deklaratywnych odwzorowań niż rzemiosła te.
Znaleziony dłuższa lista tutaj:
http://www.javacodegeeks.com/2013/10/java-object-to-object-mapper.html
zgadzam się z @paradigmatic, to prawda, że kod będzie znacznie czystsze używając Scala, ale czasami można znaleźć sobie mapowanie pomiędzy klasami przypadków, które wyglądają bardzo podobnie, a to tylko marnowanie klawiszy.
zacząłem pracę nad projektem, aby rozwiązać problemy, można go znaleźć tutaj: https://github.com/bfil/scala-automapper
Wykorzystuje makr do generowania mapowania dla Ciebie.
W tej chwili może odwzorować klasę case na podzbiór oryginalnej klasy case, obsługuje opcje i pola opcjonalne, a także inne drobne rzeczy.
Wciąż próbuję wymyślić, jak zaprojektować api do obsługi zmiany nazwy lub mapowania konkretnych pól za pomocą niestandardowej logiki, dowolnego pomysłu lub danych wejściowych, które byłyby bardzo pomocne.
Może być używany w niektórych prostych przypadkach już teraz, i oczywiście jeśli mapowanie stanie się bardzo złożone, może być lepiej zdefiniować mapowanie ręcznie.
Biblioteka umożliwia również ręczne definiowanie typów Mapping
między klasami przypadków w każdym przypadku, które mogą być podane jako niejawny parametr metody AutoMapping.map(sourceClass)
lub sourceClass.mapTo[TargetClass]
.
UPDATE
Właśnie ukazała się nowa wersja, która obsługuje Iterables, mapy i pozwala przejść w dynamicznych przekształceń (w celu wspierania zmiany nazwy i niestandardową logikę na przykład)
Chociaż patrząc AutoMapper Pobiegłem do tego wpisu SO: [Automapper for Java?] (http://stackoverflow.com/questions/3319002/automapper-for-java), który wspomina o kilku możliwościach, w tym [Dozer] (http://dozer.sourceforge.net /). Niekoniecznie "Scala", ale ... –
Do tego czasu ktoś musiał już zacząć opracowywać go w Scala ... – mrcaramori
Nic nie istnieje dla Scali, o której wiem. Mam zamiar napisać API mapowania właściwości dla [ModelMapper] (http://modelmapper.org), które lepiej wykorzystuje niektóre funkcje Scala, ale na razie z pewnością można używać ModelMapper tak samo jak dla Javy. – Jonathan