Как реализовать внедрение зависимостей во Flutter вручную? - PullRequest
0 голосов
/ 12 мая 2018

Поскольку официальной библиотеки от команды по флаттеру нет, я пытаюсь внедрить внедрение зависимостей в флаттер вручную, используя шаблон синглтона, после долгого поиска я нашел следующее:

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

Теперь Injector - это синглтон с одним экземпляром, а SomeClass - это зависимость, которую я хочу добавить в мой код.Приведенный выше код работает, но проблема в том, где я должен создать экземпляр класса Injector и сделать его доступным везде, где есть в моем коде.Как вы думаете, Global Variable хорошо в этой ситуации или есть лучший способ?Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Это моё решение этой проблемы.Сначала я создал файл dart с именем injector.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, который создает необходимые зависимости, а затем открывает эти зависимости с помощью top.переменныеТаким образом, зависимости доступны везде, где доступен пакет injector.dart.

Как вы думаете, ребята?это хорошо или есть лучшая реализация?Спасибо

0 голосов
/ 12 мая 2018

Для реализации собственного внедрения зависимости я обычно использую комбинацию

  • Класс '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 через экземпляр привязки, вы можете просто обратиться к членам напрямую.

...