Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Singleton in di.dart

How can I create a Singleton instance in di.dart?

Seems like if I do this:

module = new Module()
  ..bind(GameRepository)
  ..bind(MessageFactory)
  ..bind(Broadcaster);

my GameRepository gets instantiated multiple times if when I do

injector.get(GameRepository)

I tried to do

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

and that seems to work, but it's easy because GameRepository has no parameter, but shouldn't there be a way to tell the di framework to bind it as a singleton without requiring me to instantiate it (and maintain its constructor call?)

edit: @Günter, I do want a Singleton, however in my case I want to use my GameRepository from my redstone.dart resource AND from outside too. So I bind the GameRepository and then do this:

// To use it outside of the resource
injector = new ModuleInjector([modules.getProductionModule()]);
// To use it in redstone
app.addModule(module);

And now I can see that redstone hold a different reference on GameRepository from the one I get when I do injector.get(GameRepository)

I don't know if the question has become too specific though :P

like image 788
Pacane Avatar asked Jul 11 '26 14:07

Pacane


2 Answers

As far as I know DI always returns the same instance, therefore everything is a singleton. If you don't want singletons you can bind a factory. For more details see https://stackoverflow.com/a/22944185/217408

like image 142
Günter Zöchbauer Avatar answered Jul 14 '26 05:07

Günter Zöchbauer


How about using a factory constructor with the singleton pattern in an implementation or extension of that class

class GameRepositorySingleton extends GameRepository{

    static GameRepository _instance;

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

and then you can use it in DI like this

module = new Module()
  ..bind(GameRepository, toImplementation: GameRepositorySingleton);

To be honest I haven't tried this out. Tell me if it works. You might have to change extends to implements if the editor complains that GameRepository isn't a GameRepositorySingleton.

like image 39
Cristian Garcia Avatar answered Jul 14 '26 05:07

Cristian Garcia



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!