Skip to main content

syringe 1.0.0-alpha.1 copy "syringe: ^1.0.0-alpha.1" to clipboard
syringe: ^1.0.0-alpha.1 copied to clipboard

Syringe is a dependency injection (DI) library for Dart applications.

example/example.dart

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();
}
2
likes
160
points
1.55k
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

Syringe is a dependency injection (DI) library for Dart applications.

Repository (GitHub)
View/report issues

Topics

#di #dependency

License

MIT (license)

Dependencies

meta

More

Packages that depend on syringe