首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >di.dart中的单例

di.dart中的单例
EN

Stack Overflow用户
提问于 2015-04-12 13:56:46
回答 3查看 632关注 0票数 3

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

如果我这么做的话

代码语言:javascript
复制
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,然后执行以下操作:

代码语言:javascript
复制
// 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)时得到的不同

我不知道这个问题是否变得过于具体了:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-12 14:00:41

据我所知,DI总是返回同一个实例,因此一切都是单例。如果你不想要单身汉,你可以把工厂绑起来。有关详细信息,请参阅https://stackoverflow.com/a/22944185/217408

票数 2
EN

Stack Overflow用户

发布于 2015-04-12 16:32:12

在该类的实现或扩展中使用带有单例模式的工厂构造函数如何?

代码语言:javascript
复制
class GameRepositorySingleton extends GameRepository{

    static GameRepository _instance;

    factory GameRepositorySingleton (A a, B b, ...){
        if (_instance == null)
        {
            _instance = new GameRepository (a, b);
        }
        return _instance;
    }
}

然后您可以像这样在DI中使用它

代码语言:javascript
复制
module = new Module()
  ..bind(GameRepository, toImplementation: GameRepositorySingleton);

老实说我还没试过呢。告诉我它是否有效。如果编辑器抱怨extends不是GameRepositorySingleton,则可能不得不将GameRepository更改为GameRepositorySingleton

票数 2
EN

Stack Overflow用户

发布于 2015-04-12 17:14:07

所以我现在就这么做了。由于我现在需要雷德斯通以外的DI,我有一个顶级的注射器。理想情况下,我可以和雷德斯通共用注射器,但据我所知,这似乎是不可能的。我开了一期这里。因此,就目前而言,我认为在redstone和我的代码之间共享一个单例实例化的最好方法是这样做。

代码语言:javascript
复制
// 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);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29590217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档