2015-07-11 48 views
5

我準備喝koolaid :)一個人如何使用谷歌Guice的@Inject使用Scala /(播放的2.4.x)

遊戲正在向谷歌吉斯(https://github.com/google/guice),所以我想我已經得到了這裏沒有真正的選擇,只是爲了搭便車。

不知何故我失去了一些東西。

我得到了「不要打電話給我們,我們會打電話給你」的心態和依賴注入解決方案的核心原因 - 更脆弱和更可測試的代碼。

但是有時候我想要的只是一個簡單的牙籤,不覺得有必要烤蛋糕,或者更糟糕的是寫完整的食譜烘烤一個,只是爲了獲得一個...

斯卡拉,這種語言似乎讓牙籤工廠變得微不足道(Guice的一個論點是建立工廠的成本(用Java) - 所以對我來說,這個論點至少是不起眼的,但這並不否定其他DI問題I知道)。

在斯卡拉,你有一個伴侶object(抱歉有一個寧靜的閃回 - 我需要一個時刻 - 好吧去吧 - 哦,並指責Odersky這個詞的組合不是我請...)。

對於牙籤類:

case class Toothpick(color: Color) 

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

當然,你可以得到花哨的apply等階細微的主機得到確切的牙籤你通過參照Toothpick「對象」希望只是:

val myShinyRedToothpick = Toothpick.redPlease 

所以在這種情況下,Toothpickobject是一個即時工廠。

讓事情變得簡單並不會讓事情變得正確 - 它讓事情變得簡單。

谷歌的Guice概述似乎是:一個工廠來統治他們全部

好的 - 我可以忍受這一點。他們得到了第一個 - 他們擁有了所有的土地 - 我們將永遠成爲佃農。遊戲結束。

我需要的是牙籤的例子,如何USE Guice'd up工廠。如何從正常 Scala代碼請從我的牙籤? (就像我說過的,我完全可以忽略這個觀點......所以如果真是這樣的話,那麼隨意拋出任何猴子廢物來讓我看向正確的方向)。

PS:我不需要上課爲什麼 - 我只想要一個在如何

+0

Odersky使用「伴侶模塊」。他們厭倦瞭解釋你用關鍵字對象定義了一個模塊。 –

+0

@ som-snytt啊有趣的歷史珍聞。感謝 - 如何一個簡單的單詞可以如此誤解::) – Techmag

+0

遇到這個 - 它可能會幫助... http://www.ibm.com/developerworks/library/j-guice/ – Techmag

回答

0

所以,嘿,這是一個複雜的如何做。(請注意:未經測試並徹底傻代碼)

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) 
    } 
} 

而在你的類中使用這個,你會做這樣的事情:

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

現在,它是公平的爭論:爲什麼併發症?看看如何更少行Scala代碼使用?

對我來說,最大的好處是測試實際的代碼。它歸結爲:你如何測試你的伴侶對象?如果它調用了一些隨機服務呢?我們將如何嘲笑這項服務?能夠插入依賴關係使得可以單獨和容易地測試它們。

+0

我完全錯過的一件大事就是Injected類的唯一方法是注入類。 (這顯然意味着什麼,或者至少是由「海龜一路下來」的隱喻所推斷出來的。)當你理解這個概念時,其餘部分變得更加容易。然而,直到你做,看起來你註定會永遠得到任何Guice咒語的空引用,你試圖在這個「烏龜堆棧」之外嘗試。所以這就證明了答案並不在於如何獲得牙籤,而是如何獲得實際上可以請求牙籤的一堆烏龜。 – Techmag

+0

這是部分正確的。從這個意義上講,Guice不會限制你在層次結構中的任何地方獲得任何特定的類。事實上,我認爲要考慮的規則是,如果你想要一個「注入」類,它的所有依賴也應該被「注入」。例如,我可以創建一個獨立的類,獲得對注入器的引用,或者(a)注入類,Guice將爲我填充依賴項(b)自己創建實例,確保所有依賴項都被管理由我。 – Serendipity

相關問題