如何在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资源和外部使用我的redstone.dart。因此,我绑定GameRepository,然后执行以下操作:
// To use it outside of the resource
injector = new ModuleInjector([modules.getProductionModule()]);
// To use it in redstone
app.addModule(module);现在我可以看到,redstone在GameRepository上的引用与我做injector.get(GameRepository)时得到的不同
我不知道这个问题是否变得过于具体了:
发布于 2015-04-12 14:00:41
据我所知,DI总是返回同一个实例,因此一切都是单例。如果你不想要单身汉,你可以把工厂绑起来。有关详细信息,请参阅https://stackoverflow.com/a/22944185/217408
发布于 2015-04-12 16:32:12
在该类的实现或扩展中使用带有单例模式的工厂构造函数如何?
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);老实说我还没试过呢。告诉我它是否有效。如果编辑器抱怨extends不是GameRepositorySingleton,则可能不得不将GameRepository更改为GameRepositorySingleton。
发布于 2015-04-12 17:14:07
所以我现在就这么做了。由于我现在需要雷德斯通以外的DI,我有一个顶级的注射器。理想情况下,我可以和雷德斯通共用注射器,但据我所知,这似乎是不可能的。我开了一期这里。因此,就目前而言,我认为在redstone和我的代码之间共享一个单例实例化的最好方法是这样做。
// 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);
}https://stackoverflow.com/questions/29590217
复制相似问题