syringe 1.0.0-alpha.1
syringe: ^1.0.0-alpha.1 copied to clipboard
Syringe is a dependency injection (DI) library for Dart applications.
import 'dart:async';
import 'package:syringe/syringe.dart';
// 1. Define Bar dependency (Async)
final class BarDependency extends AsyncDependency<Bar> {
@override
Future<Bar> onInject(Locator locator) async {
// Simulate delay before creating Bar instance.
await Future.delayed(Duration(milliseconds: 500));
return Bar(title: 'Hello from Parent Scope');
}
@override
FutureOr<void> dispose() {
print('Disposing BarDependency from parent');
}
}
// 2. Define Foo dependency (Sync, depends on Bar from parent)
final class FooDependency extends SyncDependency<Foo> {
@override
List<Type> get dependencies => [BarDependency];
@override
Foo onInject(Locator locator) {
final bar = locator.value<BarDependency, Bar>();
return Foo(bar: bar);
}
}
void main() async {
print('--- Setting up Parent Scope ---');
final parentBindings = <Binding>[
Binding.exported(
BarDependency(),
name: 'ParentBar',
description: 'Exported Bar service in parent scope',
),
];
final parentInjector = Injector<void>(
bindings: parentBindings,
onInject: (_) {},
);
await parentInjector.inject();
print('\n--- Setting up Child Scope ---');
final childBindings = <Binding>[
Binding.exported(
FooDependency(),
name: 'ChildFoo',
description: 'Foo service in child scope depending on parent Bar',
),
];
final childInjector = Injector<Foo>(
parent: parentInjector,
bindings: childBindings,
onInject: (locator) {
return locator.value<FooDependency, Foo>();
},
);
// Perform injection in child scope
final foo = await childInjector.inject();
print('Result Foo bar title: ${foo.bar.title}');
print('Foo created at: ${foo.time}');
print('\n--- Disposing Scopes ---');
await childInjector.dispose();
await parentInjector.dispose();
}
/// Class representing a Bar instance.
class Bar {
final String title;
Bar({required this.title});
}
/// Class representing a Foo instance.
class Foo {
final Bar bar;
final DateTime time;
Foo({required this.bar}) : time = DateTime.now();
}