Для реализации собственного внедрения зависимости я обычно использую комбинацию
- Класс 'Bindings', который имеет геттеры для всех внедряемых сервисов
- Статический геттер / установщик, который содержитединичные экземпляры класса Bindings.Это важно для переопределения привязок.
Получатели, которые возвращают классы, должны лениво создавать их, если у них есть зависимости.Это позволяет вам переопределять любые части вашего графика, расширяя класс Bindings и устанавливая его в глобальных привязках.Например, ниже у меня есть три класса, третий из которых зависит от первых двух.
class Foo {}
class Bar {}
class Fizz {
Fizz(this.foo, this.bar);
final Foo foo;
final Bar bar;
}
class Bindings {
/// Can be final since there are no dependencies
final Foo foo = new Foo();
final Bar bar = new Bar();
Fizz _fizz;
Fizz get fizz {
_fizz ??= new Fizz(foo, bar);
return _fizz;
}
}
Bindings get bindings => _bindings;
Bindings _bindings;
set bindings(Bindings value) {
_bindings = value;
}
Теперь предположим, что я хочу переопределить Foo для тестирования.Я могу расширить класс Bindings и переопределить поле / получатель, которое возвращает Foo.и в моей тестовой настройке я установил привязки с этим новым экземпляром.Теперь, когда Fizz создан, вместо Foo используется экземпляр MockFoo
class MockFoo implements Foo {}
class BindingsOverride extends Bindings {
@override
final Foo foo = new MockFoo();
}
void main() {
bindings = new BindingsOverride();
}
Редактировать: В более ранней версии я использовал статический класс.Я не думаю, что вам нужно ссылаться на foo
и bar
через экземпляр привязки, вы можете просто обратиться к членам напрямую.