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)
- 1. Czy jest coś takiego jak indeks pmax?
- 2. Czy jest coś takiego jak pngcrush dla GIF-ów?
- 3. Czy dla basha jest coś takiego jak perls __DATA__?
- 4. Czy jest coś takiego jak Codecademy dla Java
- 5. Czy jest coś takiego jak require.txt dla R?
- 6. Czy jest coś takiego jak "New Relic" dla aplikacji Perla?
- 7. Czy jest coś takiego jak mapy źródłowe dla CSS?
- 8. Czy jest coś takiego jak Incanter dla Haskella?
- 9. Czy jest coś takiego jak "global ::" dla VB.NET?
- 10. Cron API: czy jest coś takiego?
- 11. Oddzwonienie do MySQL - czy jest coś takiego?
- 12. Coś takiego jak silnik obliczeniowy dla C#?
- 13. Czy istnieje coś takiego jak jQuery.toggle (boolean)?
- 14. Czy istnieje coś takiego jak konstruktor const?
- 15. Czy istnieje coś takiego jak Single.empty()
- 16. Czy istnieje coś takiego jak NSPredicateEditor dla systemu iOS?
- 17. Czy jest coś takiego jak __LINE__ w Verilog?
- 18. Czy istnieje coś takiego jak MAMP dla Ruby on Rails?
- 19. Czy istnieje coś takiego jak Sprocket dla Java
- 20. Czy Gson ma coś takiego jak @JsonProperty dla metod?
- 21. Czy istnieje coś takiego jak dekoratory Pythona dla C#?
- 22. Czy jest coś takiego jak zbyt wiele zajęć?
- 23. Czy jest coś takiego jak printf w Action Script 3?
- 24. Czy jest coś takiego jak "std :: and" lub "std :: or"?
- 25. Czy jest coś takiego jak NSDictionary w systemie Android?
- 26. Czy jest coś takiego jak SESJA w aplikacji Windows?
- 27. Czy istnieje coś takiego jak "funkcja" Haskella wbudowana w Scalę?
- 28. Czy istnieje coś takiego jquery dla WPF/XAML?
- 29. Sesja ASP.NET Web API czy coś takiego?
- 30. Numery śledzenia testów UPS (czy jest coś takiego?)
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