2016-06-12 53 views
1

我有一個類阿比與依賴注入,與使用該注入的功能:播放2.5斯卡拉進口類依賴注入

class Api @Inject()(userRepo: UserRepo) extends Controller { 
    def user(email: String) ={ 
    userRepo.getUser(email).map(....) 
    } 
} 

而且在同一個包對象FlashSession - 我在很多其他文件中使用它。 我想使用功能用戶到我的目標FlashSession

object FlashSession { 
    def test = ... Api.user("[email protected]") .... 
} 

但我不能導入阿比類,因爲它是一個類,而不是一個對象,我不能把這個功能到孔帕尼翁對象,因爲它需要DI。

處理它的最佳方法是什麼?

謝謝你的幫助!

回答

1

你可以在裏面FlashSession

object FlashSession { 
    def test = new Api(new UserRepo()).user(...) 
} 

object FlashSession { 
    def test(userRepo: UserRepo) = new Api(userRepo).user(...) 
} 

創建這個Api類但這可能不是你真正想要的。您不應將全局伴隨對象與DI一起使用,特別是對數據庫數據操作。

+1

謝謝,但實際上,這不是我想要的,因爲我使用Api類作爲控制器。但我可以改變你的答案,並用它做一些事情。 「不使用全局伴隨對象與DI」是什麼意思?這意味着你的解決方案不是很好,對嗎? – Lauriane

+0

是的,使用構造函數DI需要在代碼中進行一些修改。您只需通過構造函數傳遞所需的類,然後使用Global對象。下面的@ bruce-lowe答案顯示了這種方法的良好洞察力。 – liosedhel

1

由於Api是一個類而不是對象,所以不能使用Api.user(「email」)。在Java中它就像從靜態方法調用一個非靜態方法。理論上你可以有一個以上的Api實例,甚至沒有Api實例。因此,在對象FlashSession中使用類Api是沒有意義的。

如果更改的Flash一類和注入API類,將更好地工作:

class FlashSession @Inject()(api: Api) { 
    def test = ... api.user("[email protected]") .... 
} 

然後,您將需要注入FlashSession到所有使用它的類。

您可能會發現新開發人員會將所有對象都設置爲最簡單的對象,而不是執行任何DI(依賴注入)。爲了允許更多有效的模擬測試,他們演變爲使用DI。然而,混合和匹配類與DI和對象不能很好地工作。

+0

我問了這個問題,知道是否有一個「美麗」的代碼來實現我想要的。顯然不是......所以我可能會忘記它,並以另一種方式去做,這並不會造成這樣的混亂。 但是,謝謝你的回答! – Lauriane