This is a simple and flexible dependency injection container for dart.
If you are using Flutter consider the dependencies_flutter package.
- Immutability: The injector is created via a builder so it won't be modified after being created.
- Modules: Separate dependencies into logical pars. Useful to separate by environments.
- Singletons: Bind singletons and lazy singletons.
- Factories: Bind factories.
- Named dependencies: Give your dependencies custom names.
- Extra arguments: Pass arguments to your factory methods.
- Works with Flutter: Since it doesn't use reflexion it works with Flutter.
Optionally create a module.
class PlayerModule implements Module {
@override
void configure(Binder binder) {
binder
..bindSingleton("playerkey", name: "api_key")
..bindFactory((injector, params) => Player(params["playerId"]))
..bindLazySingleton((injector, params) => Rest(injector));
}
}
Create a builder and use it to instantiate an injector.
final builder = Injector.builder()
..bind(instance: "abc123", isSingleton: true, name: "api_key")
..bindSingleton("abc123", name: "api_key_2")
..bindFactory((injector, params) => User(params["userId"]))
..bindLazySingleton((injector, params) => RestController(params["path"]))
..install(PlayerModule());
final injector = builder.build();
Get instances from the container.
final Player player = injector.get(params: {"playerId":1});
final Rest rest = injector.get();
final String apiKey = injector.get(name: "api_key");
Optionally you can manage injectors with the registry. Feel free to create your own or use the singleton.
InjectorRegistry.instance.register(injector);
Injectors can be fetched from the registry.
final injector = InjectorRegistry.instance.get();
final namedInjector = InjectorRegistry.instance.get(name: "named_injector");