2016-09-07 74 views
0

我有一個非常簡單的場景來解決使用DI,但我無法找到一個適當的示例/文檔來幫助我完成任務。我是Scala/Guice世界的新手。Scala Guice中的依賴注入 - 傳遞參數

的電流分量像這樣

trait Foo { 
} 

class FooImpl extends A { 

} 

trait Bar { 
    val description: String 
} 

class BarImpl(val description: String) extends Bar { 

} 

現在,我有Foo和酒吧之間的依賴關係。 所以,平時的代碼看起來像這樣

class FooImpl extends Foo { 
    Bar bar = createBar("Random Bar Value!") 
} 

其中createBar("Bar!")簡單地返回new BarImpl("Random Bar Value")。當然,爲了簡潔起見,我會刪除工廠/幫手。

我意識到,當我使用「新」時,這是脫離了DI範例。我想確保Bar可以根據參數注入到FooImpl中。有點像使用工廠。我們如何在Scala/Guice世界中使用DI。

我看了一下AssistedInjection/Named Parameters,但是我無法理解這個用法最終會如何。我認爲這是最好的方式,但不知道應該如何編寫/測試。

回答

0

好吧,最後這是我的工作。爲那些想要處理基於Scala的輔助注入的人重寫這些步驟。

Foo可能需要Bar,但真正需要注入的是BarFactory,而不是Bar。

需要創建BarFactory,但實現可以留給Guice。這是棘手的地方。

trait BarFactory { 
    def create(msg:String):Bar 
} 

因此,讓我們重溫Foo和Bar:

@ImplementedBy(classOf[FooImpl]) 
trait Foo { 
    def getBar(msg: String): Bar 
} 

class FooImpl @Inject() (barFactory: BarFactory) extends Foo { 
    override def getBar(msg: String): Bar = { 
    barFactory.create(msg) 
    } 
} 

@ImplementedBy(classOf[BarImpl]) 
trait Bar { 
    def echo() : String 
} 

//Note that we use the @Assisted Annotation Here. 
class BarImpl @Inject() (@Assisted msg: String) extends Bar { 
    override def echo(): String = msg 
} 

創建實際的工廠作爲一個模塊

class TempModule extends AbstractModule { 
    override def configure(): Unit = { 
    install(new FactoryModuleBuilder() 
     .implement(classOf[Bar], classOf[BarImpl]) 
     .build(classOf[BarFactory])) 
    } 
} 

而且一旦開始部分完成,工廠實現將提供Guice,你應該能夠使用Factory創建你的實際實現。