如何使用依赖注射扑动?

时间:2017-05-23 10:06:53

标签: android angularjs dependency-injection dart flutter

我想用di。在flutter中我添加了这个https://pub.dartlang.org/packages/di包我的项目,我开始阅读这篇https://webdev.dartlang.org/angular/guide/dependency-injection文章,但我并不完全理解。

所以没关系: 在服务类上使用@Injectable()注释(例如:MyServices),但是如何注入其他类? 例如,我想类似:

class MyClass{
   //some variable
   var asd = MyService.asd; //need inject var.
                            //maybe use injector.get(MyService).asd; 
                            //but how add injector? (I don't add across constructor)

   MyService.oneMethod;//need inject method
}

main(){
    var injector = new ModuleInjector([new Module()
       ..bind(MyService)
    ]);
}

关键是,我不想使用构造函数。我想直接使用注射器。这可以在颤动/飞镖?

5 个答案:

答案 0 :(得分:5)

Angulars DI包不能独立于Angular使用。

di软件包已经过时,取决于dart:mirrors,这在Flutter中不可用

似乎有一个新的DI包正在进行中,它应该取代Angulars内置DI,并且也应该可以在Flutter或服务器端应用程序中单独使用,但是还没有预发布或源代码可用。

<强>更新

宣布的DI套餐无限期推迟。

答案 1 :(得分:5)

Google最近开源了一个与Flutter兼容的依赖注入框架。它可以在这里找到:https://github.com/google/inject.dart

此项目提供静态编译时依赖项注入,而不是依赖于反射在运行时注入依赖项。如果您熟悉Dagger,它似乎非常相似。

值得注意的是 - 这不是官方的Google或Dart团队项目。在撰写本文时,几乎没有文档,它目前被认为是开发人员预览。

答案 2 :(得分:0)

如果你想使用一个类作为Singleton,从我看到的,常见的用例是使用工厂构造函数。

How do you build a Singleton in Dart?

现在不必使用Flutter的任何依赖注入系统。

答案 3 :(得分:0)

我在这里也遇到了同样的问题,所以我专门为Flutter创建了一个飞镖包。它依靠工厂方法而不是mirror api,因此可以在抖动中工作。同时仍使用熟悉的IOC模式。希望这会有所帮助!

https://pub.dartlang.org/packages/flutter_simple_dependency_injection

import 'package:flutter_simple_dependency_injection/injector.dart';

void main() {
  final injector = Injector.getInjector();
  injector.map(Logger, (i) => new Logger(), isSingleton: true);
  injector.map(String, (i) => "https://api.com/", key: "apiUrl");
  injector.map(SomeService, (i) => new SomeService(i.get(Logger), i.get(String, "apiUrl")));

  injector.get(SomeService).doSomething();
  // passing in the [SomeService] as a generic parameter strongly types the return object.
  injector.get<SomeService>(SomeService).doSomething();
}

class Logger {
  void log(String message) => print(message); 
}

class SomeService {
  final Logger _logger;
  final String _apiUrl;

  SomeService(this._logger, this._apiUrl);

  void doSomething() {
    _logger.log("Doing something with the api at '$_apiUrl'");
  }
}

答案 4 :(得分:0)

你好,这样的事情怎么办?非常简单的实现,Injector本身是单例的,并且还向其中添加了类。当然可以很容易地扩展。如果您正在寻找更复杂的东西,请检查以下软件包:https://pub.dartlang.org/packages/flutter_simple_dependency_injection

void main() {  
  Injector injector = Injector();
  injector.add(() => Person('Filip'));
  injector.add(() => City('New York'));

  Person person =  injector.get<Person>(); 
  City city =  injector.get<City>();

  print(person.name);
  print(city.name);
}

class Person {
  String name;

  Person(this.name);
}

class City {
  String name;

  City(this.name);
}


typedef T CreateInstanceFn<T>();

class Injector {
  static final Injector _singleton =  Injector._internal();
  final _factories = Map<String, dynamic>();

  factory Injector() {
    return _singleton;
  }

  Injector._internal();

  String _generateKey<T>(T type) {
    return '${type.toString()}_instance';
  }

  void add<T>(CreateInstanceFn<T> createInstance) {
    final typeKey = _generateKey(T);
    _factories[typeKey] = createInstance();
  }

  T get<T>() {
    final typeKey = _generateKey(T);
    T instance = _factories[typeKey];
    if (instance == null) {
      print('Cannot find instance for type $typeKey');
    }

    return instance;
  }
}