Dependency injection 如何在颤振中手动实现依赖项注入?

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

由于Flatter团队没有官方的库,我尝试使用singleton模式在Flatter中手动实现依赖注入,经过长时间的搜索,我得出了以下结论:

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类的单个实例。这对于重写绑定很重要
返回类的getter如果有依赖项,则应该惰性地构造它们。这允许您通过扩展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更易于理解和模块化