2020-06-28 10:34:22 +03:00
|
|
|
|
import 'package:dart_di/di_container.dart';
|
2020-07-03 08:27:49 +03:00
|
|
|
|
import 'package:dart_di/resolvers/factory_resolver.dart';
|
2020-06-28 10:34:22 +03:00
|
|
|
|
import 'package:dart_di/resolvers/resolver.dart';
|
2020-07-03 00:43:23 +03:00
|
|
|
|
import 'package:dart_di/resolvers/singelton_resolver.dart';
|
|
|
|
|
|
import 'package:dart_di/resolvers/value_resolver.dart';
|
2020-06-28 10:34:22 +03:00
|
|
|
|
|
|
|
|
|
|
class ResolvingContext<T> extends Resolver {
|
2020-07-03 00:43:23 +03:00
|
|
|
|
/// Корневой резолвер
|
|
|
|
|
|
Resolver<T> get resolver => _resolver;
|
|
|
|
|
|
|
2020-06-28 10:34:22 +03:00
|
|
|
|
DiContainer _container;
|
|
|
|
|
|
|
|
|
|
|
|
Resolver _resolver;
|
|
|
|
|
|
|
|
|
|
|
|
ResolvingContext(this._container);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Разрешает зависимость типа [T]
|
|
|
|
|
|
* @return - возвращает объект типа [T]
|
|
|
|
|
|
*/
|
|
|
|
|
|
@override
|
|
|
|
|
|
T resolve() {
|
2020-06-28 10:54:26 +03:00
|
|
|
|
_verify();
|
|
|
|
|
|
return _resolver?.resolve();
|
2020-06-28 10:34:22 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Добавляет резолвер в качестве корневого резолвера
|
|
|
|
|
|
* С помощью этого метода вы можете добавить любой
|
|
|
|
|
|
* пользовательский резолвер
|
|
|
|
|
|
*/
|
|
|
|
|
|
ResolvingContext<T> toResolver<TImpl extends T>(Resolver<TImpl> resolver) {
|
2020-06-28 10:43:07 +03:00
|
|
|
|
_resolver = resolver;
|
|
|
|
|
|
return this;
|
2020-06-28 10:34:22 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Создать резолвер значения
|
|
|
|
|
|
*/
|
|
|
|
|
|
ResolvingContext<T> toValue<TImpl extends T>(T value) {
|
2020-07-03 00:43:23 +03:00
|
|
|
|
Resolver<TImpl> resolver = ValueResolver(value);
|
|
|
|
|
|
return toResolver<TImpl>(resolver);
|
2020-06-28 10:34:22 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Преобразователь в сингелтон
|
|
|
|
|
|
*/
|
|
|
|
|
|
ResolvingContext<T> asSingleton() {
|
2020-07-03 00:43:23 +03:00
|
|
|
|
return toResolver(SingletonResolver<T>(resolver));
|
2020-06-28 10:34:22 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Создать фабричный resolver без каких-либо зависимостей
|
|
|
|
|
|
*/
|
|
|
|
|
|
ResolvingContext<T> toFactory<TImpl extends T>(TImpl Function() factory) {
|
2020-07-03 08:27:49 +03:00
|
|
|
|
Resolver<TImpl> resolver = FactoryResolver<TImpl>(factory);
|
|
|
|
|
|
return toResolver(resolver);
|
2020-06-28 10:34:22 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Создать фабричный resolver с 1 зависимостью от контейнера
|
|
|
|
|
|
*/
|
|
|
|
|
|
ResolvingContext<T> toFactory1<T1>(T Function(T1) factory) {
|
2020-07-03 08:43:20 +03:00
|
|
|
|
Resolver<T> resolver =
|
|
|
|
|
|
FactoryResolver<T>(() => factory(_container.resolve<T1>()));
|
|
|
|
|
|
return toResolver(resolver);
|
2020-06-28 10:34:22 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Создать фабричный resolver с 2 зависимостями от контейнера
|
|
|
|
|
|
*/
|
|
|
|
|
|
ResolvingContext<T> toFactory2<T1, T2>(T Function(T1, T2) factory) {
|
2020-07-03 09:16:24 +03:00
|
|
|
|
Resolver<T> resolver = FactoryResolver<T>(
|
|
|
|
|
|
() => factory(_container.resolve<T1>(), _container.resolve<T2>()));
|
|
|
|
|
|
return toResolver(resolver);
|
2020-06-28 10:34:22 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Создать фабричный resolver с 3 зависимостями от контейнера
|
|
|
|
|
|
*/
|
|
|
|
|
|
ResolvingContext<T> toFactory3<T1, T2, T3>(T Function(T1, T2, T3) factory) {
|
2020-07-03 09:21:16 +03:00
|
|
|
|
Resolver<T> resolver = FactoryResolver<T>(() => factory(
|
|
|
|
|
|
_container.resolve<T1>(),
|
|
|
|
|
|
_container.resolve<T2>(),
|
|
|
|
|
|
_container.resolve<T3>()));
|
|
|
|
|
|
return toResolver(resolver);
|
2020-06-28 10:34:22 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Создать фабричный resolver с 4 зависимостями от контейнера
|
|
|
|
|
|
*/
|
|
|
|
|
|
ResolvingContext<T> toFactory4<T1, T2, T3, T4>(
|
|
|
|
|
|
T Function(T1, T2, T3, T4) factory) {
|
|
|
|
|
|
// TODO: implement toFactory4
|
|
|
|
|
|
throw UnimplementedError();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Создать фабричный resolver с 5 зависимостями от контейнера
|
|
|
|
|
|
*/
|
|
|
|
|
|
ResolvingContext<T> toFactory5<T1, T2, T3, T4, T5>(
|
|
|
|
|
|
T Function(T1, T2, T3, T4, T5) factory) {
|
|
|
|
|
|
// TODO: implement toFactory5
|
|
|
|
|
|
throw UnimplementedError();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Создать фабричный resolver с 6 зависимостями от контейнера
|
|
|
|
|
|
*/
|
|
|
|
|
|
ResolvingContext<T> toFactory6<T1, T2, T3, T4, T5, T6>(
|
|
|
|
|
|
T Function(T1, T2, T3, T4, T5, T6) factory) {
|
|
|
|
|
|
// TODO: implement toFactory6
|
|
|
|
|
|
throw UnimplementedError();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Создать фабричный resolver с 7 зависимостями от контейнера
|
|
|
|
|
|
*/
|
|
|
|
|
|
ResolvingContext<T> toFactory7<T1, T2, T3, T4, T5, T6, T7>(
|
|
|
|
|
|
T Function(T1, T2, T3, T4, T5, T6, T7) factory) {
|
|
|
|
|
|
// TODO: implement toFactory7
|
|
|
|
|
|
throw UnimplementedError();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Создать фабричный resolver с 8 зависимостями от контейнера
|
|
|
|
|
|
*/
|
|
|
|
|
|
ResolvingContext<T> toFactory8<T1, T2, T3, T4, T5, T6, T7, T8>(
|
|
|
|
|
|
T Function(T1, T2, T3, T4, T5, T6, T7, T8) factory) {
|
|
|
|
|
|
// TODO: implement toFactory8
|
|
|
|
|
|
throw UnimplementedError();
|
|
|
|
|
|
}
|
2020-06-28 10:54:26 +03:00
|
|
|
|
|
|
|
|
|
|
void _verify() {
|
|
|
|
|
|
if (_resolver == null) {
|
|
|
|
|
|
throw StateError("Can\'t resolve T without any resolvers. " +
|
|
|
|
|
|
"Please check, may be you didn\'t do anything after bind()");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2020-06-28 10:34:22 +03:00
|
|
|
|
}
|