type
status
date
slug
summary
tags
category
icon
password
我们几乎已经完成了应用程序用户方法和应用程序架构。我们在应用程序中获得了小段代码,这些代码根据清洁架构的原则进行了分离。现在,在继续在 UI 中使用它们之前,我们必须注意一件事。我们有很多类,并且与其依赖关系解耦,并通过构造函数接受这些依赖关系。但我们必须以某种方式传递它们。
<ins/>
Dependency Injection
几乎每个类都有一些依赖项,如果查看FirebaseRepositoryImpl和FirebaseRemoteDataSourceImpl 。有多种服务定位器,但在本系列中我们将使用get_it ,这是一个针对 Dart 和 Flutter 的简单服务定位器,可以用来代替InheritedWidget和Provider 。
到目前为止,我们已经创建了许多类,我们将回顾所有这些类,从顶部的表示逻辑持有者( Cubits )到向下的远程数据源。
让我们在新文件中创建初始设置并将其命名为injection_container 。该文件将位于lib目录中。我们文件的基本结构如下所示。
Injection_container.dart
当我们的应用程序在这个init()内从 main.dart 启动时,将调用此init()方法,所有类和合约都将被注册,随后也使用存储在sl中的GetIt的单例实例进行注入(这是服务定位器的缩写) )。
get_it 包提供了创建单例和工厂实例以及许多其他方法。在本文中,我们将仅涉及registerFactory 、 registerSingleton和registerLazySingleton 。正如您所看到的第一个评论 Cubits,首先我们要注册 Cubits。
Register Factory:
工厂注册在每次调用该类后提供该类的新实例。这是注册视图模型或在我们的例子中 Cubits 的好方法。注册过程非常简单。 GetIt 类有 call() 方法,与我们的用例有 call() 方法非常相似
Injection_container.dart
通过使用类型推断,sl.call() 将确定哪个对象应在构造函数参数中传递。你是对的!当类型也被注册时,这就成为可能。现在很明显我们还应该注册用例。
注意:表示逻辑持有者不应注册为单例。因为您的应用程序确实有多个页面,就像我们的应用程序 Instagram 有多个页面一样,所以当我们在页面之间导航时,我们可能想要进行一些清理,例如关闭流。就像当我们从一页导航到下一页时,我们关闭了一个打开的流,当我们返回同一页面时,我们希望新的 Cubit 实例来重建它。
如果我们使用单例并在页面之间导航,当我们返回同一页面时,我们将使用关闭的流,而不是使用打开的流创建新实例。
因为 get_it 单例创建一个实例,所以缓存它并在应用程序的整个生命周期中使用它。它不创建新实例。
<ins/>
最后,通过注册所有 Cubits,injection_container.dart 将如下所示:
Injection_container.dart
Register Singletons:
正如前面提到的,我们有两种单例。那是registerSingleton 和registerLazySingleton。它们之间的区别是常规非惰性单例在应用程序启动后立即注册,而惰性单例仅在被请求作为其他类的依赖项时才注册。
Cubit Dependencies:
在我们的应用程序中,我们将使用 registerLazySingleton 来注册 Cubit 的依赖项,即用例。这些惰性单例将仅创建一个实例,并将在应用程序的整个生命周期中使用它。这些注册将位于用例评论下方。
注册所有用例后,我们的注入容器将如下所示:
Injection_container.dart
Register Repository:
为了注册存储库,我们将再次使用 registerLazySingleton,如果您注意到此 FirebaseRepository 是一个抽象类或契约并且无法实例化,但我们将实例化其存储库的实现。这可以通过在 registerLazySingleton 方法上指定类型参数来实现。
Register Data Sources:
由于FirebaseRepositoryImpl具有依赖项remoteDataSource,我们也应该注册该类型。
注册 Firebase 存储库和远程数据源后,代码将如下所示:
External Dependencies:
我们已经从演示逻辑持有者(Cubits)一路走到了第 3 方库。现在我们还需要注册 FirebaseFirestore 和 FirebaseAuth。最后一项与上面所有的注册略有不同。
首先,您需要获取它们的实例,然后注册为惰性单例。
Injection_container.dart
整理完毕
转到 > main.dart并初始化init()方法,就像我们对 firebase 所做的那样
解决方案代码
injection_container.dart
main.dart:
结论
依赖注入是一种使类独立于其依赖关系的编程技术。它通过将对象的使用与其创建分离来实现这一点。在下一篇文章中,我们最终将在 UI 中调用方法,并将看到迄今为止我们已完成的所有代码的实际效果