2016-04-27 156 views
0

想象一個B類如下:在播放使用吉斯註釋(斯卡拉)

class B @Inject() (wsClient: WSClient) { 
    ... 
} 

然後在另一個A級,我需要實例B:

class A { 
    val b = new B() 
} 

這會抱怨說,我沒有在我的構造函數中指定wsClient。 一個解決這個問題的辦法就是修改:

class A @Inject() (wsClient: WSClient) { 
    val b = new B(wsClient) 
} 

我還可以添加隱在我的課B.但在這兩種情況下,它只是似乎非常錯誤的我送這樣的依賴...

我怎樣才能以更優雅的方式做到這一點?

回答

1

爲什麼沒有B注入A

class A @Inject() (b: B) 

如果你的類B必須是單身,只是javax.inject.Singleton對其進行批註。

+0

我明白了,那就解決了一個問題。 然而,同樣的問題發生在繼承上,如果A擴展B,我將不得不在A中注入,然後通過B中注入的所有Deps? – Scipion

2

做DI的重點是要有inversion of control。您的綁定決定了應用程序的構建方式,而不是應用程序中的類負責自己的控制流。

val b = new B(wsClient)違反了這個原則,因爲類負責知道它應該如何構成自己,而不是由DI框架負責。

class B @Inject() (ws: WSClient){} 

class A @Inject() (b: B) // extends B 
{} 

正如@zoltan所說,將B注入A將是解決問題的正確方法。

+0

通過做一些,我怎樣才能訪問我的班級A的Ws? b.ws不起作用,這是否意味着我需要將它綁定在B類內部? – Scipion

+1

如果A需要ws然後將其注入到A – nattyddubbs

+0

然後,我必須在A和B中都複製@Inject()(ws:WSClient),儘管將B注入A? – Scipion