如何在di.dart中创建Singleton实例?
好像我这样做:
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>}时获得的引用不同
我不知道这个问题是否过于具体:P
答案 0 :(得分:2)
据我所知DI总是返回相同的实例,因此一切都是单例。如果你不想要单身,你可以绑定一个工厂。 有关详细信息,请参阅https://stackoverflow.com/a/22944185/217408
答案 1 :(得分: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);
说实话,我还没试过这个。告诉我它是否有效。如果编辑抱怨extends
不是implements
,则可能需要将GameRepository
更改为GameRepositorySingleton
。
答案 2 :(得分:2)
所以我现在最终这样做了。因为我现在需要红石外的DI,我在顶级有一个注射器。理想情况下,我可以与雷石东分享注射器,但据我所知,这似乎是不可能的。我已经开了一个问题here。所以现在,我认为在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);
}