2015-07-11 16 views
5

jestem gotowy do picia Kool-Aid :)jaki sposób można użyć Google Guice za @Inject z Scala/(Odtwarzanie 2.4.x)

Gra przenosi się do Google Guice (https://github.com/google/guice) więc myślę, że mam nie ma tu żadnego prawdziwego wyboru, ale trzeba się do nich przyczepić.

Jakoś jednak czegoś brakuje.

Dostaję mentalność "nie nazywajmy nas, do ciebie zadzwonimy" i podstawową przyczynę rozwiązania Dependency Injection - mniej kruchy i bardziej testowalny kod.

Czasami jednak wszystko czego chcę to tylko prosty wykałaczki i nie czują potrzebę upiec ciasto, lub co gorsza napisać kompletny przepis na pieczenie jednego, żeby dostać jeden ...

Scala, wydaje się, że język sprawił, że fabryki wykałaczek są banalne (jednym z argumentów Guice'a jest koszt budowy fabryk (w języku Java) - więc dla mnie ten argument jest co najmniej znikomy z tabeli, ale to nie neguje reszty zagadnień DI wiedzieć).

W scala masz Towarzysza object (przepraszam, że Serenity retrospekcja - potrzebuję chwili - ok dobra, aby przejść - och i winę Odersky za tę kombinację słów nie ja proszę ...).

Dla klasy Wykałaczka:

case class Toothpick(color: Color) 

object Toothpick { 
    def redPlease = { 
    Toothpick(Color.RED) 
    } 
} 

Oczywiście można uzyskać fantazyjny z apply i wielu innych subtelności Scala, aby uzyskać dokładny wykałaczką chcesz jedynie odwołując się do „obiektu” Toothpick:

val myShinyRedToothpick = Toothpick.redPlease 

Tak więc w tym przypadku Toothpickobject jest natychmiastową fabryką.

Ułatwianie robienia czegoś prostego - to po prostu ułatwia.

Przegląd z Google Guice wydaje się być: jednej fabryce z art Them All.

OK - mogę z tym żyć. Oni dostali swoje pierwsze - oni są właścicielami całej ziemi - będziemy wiecznymi udziałowcami. Koniec gry.

Potrzebuję przykładu wykałaczki o tym, jak WYKORZYSTAJ a Guice'd up factory. Jak mogę uzyskać moją dziwną wykałaczkę z kodu NORMAL?

(Tak jak powiedziałem, mogę całkowicie pominąć ten punkt ... więc nie krępuj się, by cokolwiek poradzić sobie z małpami, aby w odpowiednim kierunku skłonić mnie do spojrzenia we właściwym kierunku).

PS: Nie potrzebuję lekcji DLACZEGO - Ja tylko chcę jeden w JAK.

+0

Odersky użył "modułu towarzyszącego". Zmęczyli się tłumaczeniem, że definiujesz moduł z obiektem słów kluczowych. –

+0

@ som-snytt ah ciekawostka historii. Dzięki - używając tego, jak proste pojedyncze słowo może być tak źle zrozumiane :) – Techmag

+0

Przychodzi przez to - może pomóc ... http://www.ibm.com/developerworks/library/j-guice/ – Techmag

Odpowiedz

0

Hej, tutaj jest skomplikowany HOW-TO.(Uwaga: kod niesprawdzone i dokładnie głupiego)

public class MyComplicatedGuiceModule extends AbstractModule { 
    protected void configure() { 
    // does some configuration stuff 
    } 

    @Provides 
    @Named("RedToothPick") 
    ToothPick provideRedToothPick() { 
    ToothPick(Color.RED) 
    } 

    @Provides 
    @Named("WhiteToothPick") 
    ToothPick provideWithToothPick() { 
    ToothPick(Color.WHITE) 
    } 
} 

I żeby to wykorzystać w swojej klasie, byś zrobił coś takiego:

public class WildCleanToothService(@Named("RedToothPick") toothPick: ToothPick) { 
} 

Teraz, to jest sprawiedliwe, by argumentować: dlaczego komplikacje? Zobacz, jak linie kodu Scala używa linii?

Dla mnie największą korzyścią było testowanie rzeczywistego kodu. Sprowadza się to do: Jak testujesz swój obiekt towarzyszący? Co, jeśli wywołał jakąś przypadkową usługę? Jak moglibyśmy drwić z usługi? Możliwość podłączenia wtyczek umożliwia ich testowanie indywidualnie i łatwo.

+0

Wielką rzeczą, której całkowicie przegapiłem jest to, że jedyny sposób, aby uzyskać klasę wtrysku jest z klasy Injected. (Najwyraźniej jest to rozumiane lub co najmniej wywnioskowane przez metaforę "żółwie aż do dołu"). W momencie, w którym pogwałcisz tę koncepcję, reszta stanie się znacznie łatwiejsza. Dopóki jednak nie zrobisz tego, wydaje się, że jesteś skazany na wieczne uzyskiwanie zerowych odniesień do jakichkolwiek inkantacji Guice, które spróbujesz poza tym "stosem żółwi". Tak więc okazuje się, że odpowiedź nie polega na tym, aby skupić się na wykałaczce, ale na tym, jak zdobyć stos żółwi, z których rzeczywiście można poprosić o wykałaczkę. – Techmag

+0

To częściowo prawda. W tym sensie Guice nie * ogranicza * dostępu do jakiejkolwiek określonej klasy w dowolnym miejscu w hierarchii. W rzeczywistości myślę, że reguła do przemyślenia jest taka, że ​​jeśli chcesz mieć klasę "wstrzykniętą", wszystkie jej zależności powinny być również "wstrzyknięte". Na przykład, mogę utworzyć samodzielną klasę, uzyskać odniesienie do wtryskiwacza i albo (a) Wprowadzić klasę, a Guice wypełnić dla mnie zależności (b) Utworzyć instancję samodzielnie, upewniając się, że wszystkie zależności są zarządzane przeze mnie. – Serendipity