【问题标题】:How to implement dependency injection in Flutter manually?如何在 Flutter 中手动实现依赖注入?
【发布时间】:2018-10-22 18:25:45
【问题描述】:

由于flutter团队没有官方库,我正在尝试使用单例模式手动实现flutter中的依赖注入,经过长时间的搜索,这是我想出的:

class Injector{
    Injector._internal();
    static final _singleton = new Injector._internal();
    factory Injector() => _singleton;
    SomeClass get someClass => new SomeClass();
}

现在,Injector 是单例,一旦实例化就有一个实例,SomeClass 是我想在我的代码中注入的依赖项。上面的代码有效,但问题是我应该在哪里实例化 Injector 类并使其在我的代码中的每个位置都可用。您认为Global Variable 在这种情况下好还是有更好的方法?谢谢。

【问题讨论】:

  • 现在我对 Flutter 没有太多经验,但是该类可以公开该实例的静态属性吗?当被调用时,它可以构建对象图并在后续调用中可用。

标签: dependency-injection flutter


【解决方案1】:

为了实现你自己的依赖注入,我通常结合使用

  • 一个“绑定”类,它对所有注入的服务都有获取器
  • 一个静态的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();
}

编辑:在早期版本中,我使用的是静态类。我认为你不需要通过绑定实例来引用foobar,你可以直接引用成员。

【讨论】:

  • 其实......现在我看了一下,我认为您不需要在 getter 中引用 bindings.foo,您可以使用 foo
【解决方案2】:

这是我解决这个问题的方法。首先,我使用以下代码创建了一个名为 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();
}

这就是代码的工作方式,首先我们创建一个单例类_Injector,它创建所需的依赖项,然后使用顶级变量公开这些依赖项。这样,在可以访问 injector.dart 包的任何地方都可以访问依赖项。

你们觉得呢?这是好还是有更好的实现?谢谢

【讨论】:

  • 这该死的好!就像在每个 Flutter 应用程序文件中一样,dep refs 更容易理解并且更模块化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
相关资源
最近更新 更多