Dependency injection 如何在颤振中手动实现依赖项注入?
由于Flatter团队没有官方的库,我尝试使用singleton模式在Flatter中手动实现依赖注入,经过长时间的搜索,我得出了以下结论:Dependency injection 如何在颤振中手动实现依赖项注入?,dependency-injection,flutter,Dependency Injection,Flutter,由于Flatter团队没有官方的库,我尝试使用singleton模式在Flatter中手动实现依赖注入,经过长时间的搜索,我得出了以下结论: class Injector{ Injector._internal(); static final _singleton = new Injector._internal(); factory Injector() => _singleton; SomeClass get someClass => new So
class Injector{
Injector._internal();
static final _singleton = new Injector._internal();
factory Injector() => _singleton;
SomeClass get someClass => new SomeClass();
}
现在,
Injector
是一个单例,一次实例化一个实例,SomeClass
是我想在代码中注入的依赖项。上面的代码可以工作,但问题是我应该在哪里实例化Injector
类,并使它在代码中的每个地方都可用。您认为全局变量在这种情况下是好的还是有更好的方法?谢谢。为了实现您自己的依赖注入,我通常使用
- 一个“Bindings”类,它具有所有注入服务的getter
- 一个静态getter/setter,它保存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的字段/getter。在我的测试设置中,我设置了与这个新实例的绑定。现在,在创建Fizz时,将使用MockFoo实例而不是Foo
class MockFoo implements Foo {}
class BindingsOverride extends Bindings {
@override
final Foo foo = new MockFoo();
}
void main() {
bindings = new BindingsOverride();
}
编辑:在早期版本中,我使用的是静态类。我认为您不需要通过绑定实例引用
foo
和bar
,您可以直接引用成员。这是我解决此问题的方法。首先,我用以下代码创建了一个名为injector.dart
的dart文件:
// the singleton is private to this package
final _injector = new _Injector();
// expose depedencies
final foo = _injector.foo;
final bar = _injector.bar;
class _Injector{
// create a singleton
_Injector._internal();
static final _singleton = new _Injector._internal();
factory _Injector() {
return _singleton;
}
// the dependecies
Foo get foo => new Foo();
Bar get bar => new Bar();
}
代码就是这样工作的,首先我们创建一个单例类\u Injector
,它创建所需的依赖项,然后用顶级变量公开这些依赖项。这样,依赖项就可以在injector.dart
包可访问的任何地方访问
你们觉得呢,伙计们?这是好的还是有更好的实现?谢谢现在我对颤振没有太多经验,但是该类可以公开该实例的静态属性吗?调用时,它可以构建对象图并在后续调用中可用。实际上。。。现在我看了它,我不认为你需要在getter中引用bindings.foo,你可以用fooThis该死的nice!正如在每个颤振应用文件中一样,dep REF更易于理解和模块化