2015-04-12 157 views
2

如何在di.dart中創建單身人士實例?單身人士在di.dart

好像如果我這樣做:

module = new Module() 
    ..bind(GameRepository) 
    ..bind(MessageFactory) 
    ..bind(Broadcaster); 

GameRepository被多次實例化,如果當我做

injector.get(GameRepository)

我試圖做

..bind(GameRepository, toValue: new GameRepository())

這似乎工作,但它很容易,因爲GameRepository沒有參數,但不應該有辦法告訴di框架將其綁定爲單例,而無需我實例化它(並保持其構造函數調用?)

編輯: @Günter,我確實想要一個Singleton,但是在我的情況下,我想用我的redstone.dart資源中的GameRepository和外部的。所以,我綁定GameRepository,然後做到這一點:

// To use it outside of the resource 
injector = new ModuleInjector([modules.getProductionModule()]); 
// To use it in redstone 
app.addModule(module); 

現在我可以看到,雷石東持有從一個上GameRepository不同的參考,我得到當我做injector.get(GameRepository)

我不知道,如果問題變得過於具體:P

+0

我不知道我理解你的解釋。你是否創建了多個'ModuleInjector'實例? –

+0

只有一個,但我認爲redstone.dart創建了自己的'ModuleInjector'。 – Pacane

+0

您是否試圖在紅石註冊您的模塊,並在任何地方使用紅石注入器(https://github.com/redstone-dart/redstone/blob/472ac5144a3dbf9cc14ab32745107d38fdb14fa4/lib/server.dart#L348)? –

回答

2

如何在該類

class GameRepositorySingleton extends GameRepository{ 

    static GameRepository _instance; 

    factory GameRepositorySingleton (A a, B b, ...){ 
     if (_instance == null) 
     { 
      _instance = new GameRepository (a, b); 
     } 
     return _instance; 
    } 
} 

的實現或擴展使用與單模式的工廠構造函數,然後你可以用它在DI這樣

module = new Module() 
    ..bind(GameRepository, toImplementation: GameRepositorySingleton); 

說實話我沒有試過這個。告訴我它是否有效。如果編輯投訴GameRepository不是GameRepositorySingleton,則可能必須將extends更改爲implements

+0

是的,我想過這樣做,但我覺得它打敗了使用DI框架的目的,但這可能會起作用。 – Pacane

2

所以我最終這樣做了。因爲現在我需要紅石以外的DI,所以我在頂層有一個注入器。理想情況下,我可以與雷石東分享噴油器,但據我所知,這似乎不可能。我已經打開了一個問題here。所以現在,我認爲在紅石和我的代碼之間共享一個單例實例的最好方法就是沿着這些方向。

// in my top-level main() 
ModuleInjector injector = new ModuleInjector([new Module()..bind(GameRepository)]); 

// setup of redstone 
GameRepository repo = injector.get(GameRepository); 
app.addModule(new Module()..bind(GameRepository, toValue: repo)); 

// in my redstone resource 
@app.Group('/games') 
class GamesResource { 
    GameRepository gameRepository; 

    Games(this.gameRepository); 
}