2011-07-30 22 views
17

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?

+1

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 ... –

+2

Do tego czasu ktoś musiał już zacząć opracowywać go w Scala ... – mrcaramori

+0

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

Odpowiedz

12

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 ...

1

przypadku złożonych odwzorowań można rozważyć Java odwzorowujące jak

obiekty Scala można uzyskać z Java:

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

4

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)