在 iOS 中使用 DI 延迟实例化依赖项(Typhoon & Objection)

Lazily instantiate dependencies using DI in iOS (Typhoon & Objection)

我是依赖注入模式的超级粉丝,但在移动开发中遵循这种模式时我有点怀疑,主要原因是内存分配。我将简要说明我的顾虑:

我在基于 Objective-C 的 iOS 项目中使用 DI。我同时使用了 Objection 和 Typhoon,但找不到一种方法来懒惰地实例化依赖项(不是专门谈论单例)。即使应用程序的用例流不需要分配对象,我也会注入依赖项。一旦我调用 injectDependencies: 方法(反对)或 plist 集成(台风),所有依赖项都会被注入。尽管反对网站提到它会延迟加载所有内容,但我没有看到这方面的证据。有没有办法使用这些框架延迟加载依赖项?例如,我想要这样的东西:

@property (nonatomic) MyClass *classObject;

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Check at this point that classObject should be nil

    id str = classObject.myString;

    // As soon as the getter is called, the property is first instantiated and then returned a value.
}

DI是这样的吗?如果是,那么此模式是否违反了移动设备的内存分配拇指规则(仅在需要时分配)?

这里是台风创始人。

服务器端项目的依赖注入

当我们在服务器端框架中使用依赖注入时,默认范围是单例。这是有道理的,因为可以预期服务器可以在给定的时间点为任何用例提供服务。

移动和桌面上的依赖注入

在 iOS 中,我们可能有一些后台(单例)组件,但是我们通常一次只关注一个用例。因此,Typhoon 在其 scopes 中引入了独特的 TyphoonScopeObjectGraph 作为默认

With TyphoonScopeObjectGraph 表示依赖关系被描述,Typhoon 将创建一个共享实例仅当对象图被解决。这意味着您可以使用循环依赖(委托模式)等连接复杂的对象图。 Typhoon 然后将整个对象图交给任何将使用它的对象,并释放所有权。

正常 Objective-C 运行时规则从这里开始适用 - 如果控制器或任何使用内置对象图的东西具有强 属性,那么只要该图将保留在内存中视图控制器是。

通过这种方式,我们可以从一个对象图(用例)转到另一个对象图,同时保留资源受限设备上的内存。

其他作用域

Typhoon 除了默认范围外还包括以下附加范围:

  • TyphoonScopeSingleton - 由 DI 容器保留。用于后台守护进程等。
  • TyphoonScopeLazySingleton - 就像一个普通的单例,但实例化会延迟到第一次使用时。 (我相信异议单例是这样工作的)。
  • TyphoonScopeWeakSingleton - 只要至少有一个对象保留它就被实例化和共享,然后被销毁。下次再次请求时会重新实例化。
  • TyphoonScopePrototype - 始终创建一个新实例,即使在单个求解周期中也是如此。

从一个对象图到另一个对象图:

台风构建的故事板可以加载另一个对象图,例如另一个视图控制器以处理新的用例'on-demand'。为此,我们将 Typhoon 作为工厂 class 和 inject the assembly itself,可选。然后我们可以要求 Typhoon 构建所需 class 的实例。如果您愿意,可以使用协议支持您的程序集,这样您的 class 就不会直接耦合到 Typhoon。