单身在di.dart

时间:2015-04-12 13:56:46

标签: dependency-injection dart

如何在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

3 个答案:

答案 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);
}