2015-04-12 163 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); 
}