本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
因为长期做后端开发,Spring提供的IoC功能确实用的很多。到了Flutter中各种依赖项目的管理也很麻烦,也影响单元测试的编写。
所以在Flutter还是希望延续平时的习惯,使用IoC去控制依赖等关系。但是Flutter中有一些特殊的情况,比如Flutter禁用了dart:mirrors,反射的使用上有一些问题。对比了几个框架,最开始考虑的是Google下面的inject.dart,但是文档这块比较缺,还有就是注解+代码生成的方式强大,但是不是很喜欢,也用不了这么强的功能。由于名字的原因也看了下ioc库(https://pub.dev/packages/ioc),对于API的语法不是很喜欢。最后选择使用GetIt。
使用上比较简单,引用依赖
dependencies:
get_it: ^3.1.0
代码中专门配置一个方法用于管理所有依赖配置
class IocConfiguration {
configDependencies(
{AnalysisService analysisService}) {
var loader = GetIt.I;
loader
.registerLazySingleton<LoggingService>((() => SimpleLoggingService()));
if (analysisService != null) {
loader.registerLazySingleton<AnalysisService>((() => analysisService));
} else {
loader.registerLazySingleton<AnalysisService>(
(() => FirebaseAnalysisService()));
}
loader.registerLazySingleton<HttpService>((() => DioHttpService(
loader.get<AnalysisService>(), loader.get<LoggingService>())));
return loader;
}
}
由于这个方法启动时会调用,所以所有依赖都是配置的懒加载,而各种Service都是用构造器设置依赖。
同时留了个口子,对于单元测试需要替换的/需要Mock的对象可以在配置时额外传入。这一块以后怎么管理还没有想好,目前还够用。
总的来说因为反射的缺失,这块还是满不方便,类似的还有json序列化和反序列化。
参考
https://github.com/google/inject.dart#can-i-use-this-with-flutter
https://pub.dev/packages/get_it
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯