Skip to content

Commit

Permalink
injector constructors
Browse files Browse the repository at this point in the history
  • Loading branch information
marcguilera committed Nov 4, 2018
1 parent 698398f commit 6ae0006
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 18 deletions.
2 changes: 2 additions & 0 deletions lib/dependencies.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/// Dependency injection container for dart.
library dependencies;

import 'package:meta/meta.dart';
import 'package:quiver/check.dart';
import 'package:quiver/core.dart';
import 'package:disposables/disposables.dart';
Expand All @@ -14,6 +15,7 @@ part 'src/builder/_injector_builder_container.dart';
part 'src/builder/injector_builder.dart';
part 'src/injector/_injector_base.dart';
part 'src/injector/_injector_container.dart';
part 'src/injector/_empty_injector.dart';
part 'src/injector/error.dart';
part 'src/injector/injector.dart';
part 'src/params/params.dart';
Expand Down
4 changes: 3 additions & 1 deletion lib/src/builder/_injector_builder_container.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ class _InjectorBuilderContainer extends _BinderContainer

@override
Injector build() {
return _InjectorContainer(_clone(), name: name);
return registrations.isNotEmpty
? _InjectorContainer(_clone(), name: name)
: _EmptyInjector(name: name);
}

_InjectorBuilderContainer _clone() {
Expand Down
4 changes: 0 additions & 4 deletions lib/src/builder/injector_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,6 @@ part of 'package:dependencies/dependencies.dart';

/// Builder to create [Injector] instances.
abstract class InjectorBuilder implements Binder {
factory InjectorBuilder() {
return _InjectorBuilderContainer();
}

/// Sets the name of the injector.
void setName(String name);

Expand Down
29 changes: 29 additions & 0 deletions lib/src/injector/_empty_injector.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
part of 'package:dependencies/dependencies.dart';

class _EmptyInjector extends Object with DisposableMixin implements Injector {
@override
final String name;
@override
final Iterable<Binding> bindings = const [];

_EmptyInjector({String name}):
this.name = _nameOrDefault(name);

@override
bool contains<T>({String name}) => false;

@override
T get<T>({String name, Params params}) {
throw InjectionException._internal("Can't get instance from empty injector");
}

@override
Optional<T> getOptional<T>({String name, Params params}) {
return Optional.absent();
}

@override
void doDispose() {
}

}
31 changes: 23 additions & 8 deletions lib/src/injector/injector.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
part of 'package:dependencies/dependencies.dart';

/// A function to set up bindings.
typedef void BinderFunc(Binder binder);

String _nameOrDefault(String name) => name ?? "injector";

/// Dependency injection container.
Expand Down Expand Up @@ -30,16 +27,34 @@ abstract class Injector implements Disposable {
void dispose();

/// Creates an [Injector] from it's bindings.
factory Injector(BinderFunc binderFunc, {String name}) {
checkNotNull(binderFunc, message: () => "binderFunc can't be null");
factory Injector({@required BindFunc bindFunc, String name}) {
checkNotNull(bindFunc, message: () => "bindFunc can't be null");
final b = builder();
if (name != null) b.setName(name);
binderFunc(b);
if (name == null) b.setName(name);
bindFunc(b);
return b.build();
}

/// Creates an empty [Injector].
factory Injector.empty({String name}) {
return _EmptyInjector();
}

/// Creates an [Injector] from a [Module].
factory Injector.fromModule({@required Module module, String name}) {
checkNotNull(module, message: () => "module can't be null");
return Injector(name: name, bindFunc: (bind) => bind.install(module));
}

/// Creates an [Injector] from a list of [Module] instances.
factory Injector.fromModules(
{@required Iterable<Module> modules, String name}) {
checkNotNull(modules, message: () => "modules can't be null");
return Injector.fromModule(name: name, module: Module.compose(modules));
}

/// Creates a [InjectorBuilder] to create [Injector] instances.
static InjectorBuilder builder() {
return InjectorBuilder();
return _InjectorBuilderContainer();
}
}
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ environment:
sdk: '>=2.0.0 <3.0.0'

dependencies:
quiver: ^2.0.1
quiver: ^2.0.2
disposables: ^0.0.1

dev_dependencies:
Expand Down
6 changes: 2 additions & 4 deletions test/src/builder/injector_builder_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,8 @@ void main() {
});
}

typedef void _BuilderFunc(InjectorBuilder builder);

Injector _newInjector([_BuilderFunc func]) {
final builder = InjectorBuilder();
Injector _newInjector([BindFunc func]) {
final builder = Injector.builder();
if (func != null) func(builder);
return builder.build();
}
Expand Down

0 comments on commit 6ae0006

Please sign in to comment.