Dependency injection 单子在di.dart

Dependency injection 单子在di.dart,dependency-injection,dart,Dependency Injection,Dart,如何在di.dart中创建单例实例 似乎如果我这样做: module = new Module() ..bind(GameRepository) ..bind(MessageFactory) ..bind(Broadcaster); 我的GameRepository被实例化多次,如果我这样做的话 injector.get(游戏存储库) 我试着去做 .bind(GameRepository,toValue:new GameRepository()) 这似乎是可行的,但很容易,因为Ga

如何在di.dart中创建单例实例

似乎如果我这样做:

module = new Module()
  ..bind(GameRepository)
  ..bind(MessageFactory)
  ..bind(Broadcaster);
我的
GameRepository
被实例化多次,如果我这样做的话

injector.get(游戏存储库)

我试着去做

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

这似乎是可行的,但很容易,因为
GameRepository
没有参数,但是不应该有一种方法告诉di框架将其绑定为一个单例,而不需要我实例化它(并维护它的构造函数调用?)

编辑: @Günter,我确实想要一个单人游戏,但是在我的例子中,我想从我的redstone.dart资源和外部使用我的
GameRepository
。因此,我绑定了
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)


我不知道这个问题是否变得太具体了:据我所知,DI总是返回同一个实例,因此一切都是单例的。如果你不想要单身,你可以绑定一个工厂。
有关更多详细信息,请参见在该类的实现或扩展中使用带有单例模式的工厂构造函数如何

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
,所以我现在就这样做了。因为我现在需要在红石外面进行DI,所以我在顶层有一个注入器。理想情况下,我可以与Redstone共享注射器,但据我所知,这似乎不可能。我打开了一个问题。所以现在,我认为在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);
}

我不确定我是否理解你的解释。您是否创建了多个
ModuleInjector
实例?只有一个,但我认为redstone.dart创建了自己的
ModuleInjector
。您是否尝试在redstone上注册模块并在任何地方使用redstone注入器()?是的,他们的注入器似乎是私有的,看起来有点像您需要创建一个插件才能使用共享注入器。我不知道这是否困难,我可能会完全离开。我只是浏览了一下GitHub repo中的代码。是的,我想过这样做,但是我觉得这超出了使用DI框架的目的,但这可能会奏效。