Swift-全局访问类的依赖注入

时间:2019-04-28 20:37:05

标签: swift dependency-injection

我正在切换CoreData堆栈以使用依赖项注入,而当它开始组合在一起时,我一直试图将托管对象上下文传递到我的一个类中。这是一个具有许多方法的类,许多称为ApplicationData()的其他类都使用该方法。可通过以下在类定义之外定义的内容对其进行访问:

var AppData = ApplicationData()

其他类的典型用法如下:

AppData.uploadRecords()

问题是,没有安全隐患,我不确定如何注入托管对象上下文。我想我可以在每个ApplicationData方法中都包含一个托管对象上下文变量。但是使用依赖注入的全部目的是尝试“正确”地做事。谢谢!

1 个答案:

答案 0 :(得分:1)

最常用的三种类型的DI:

  1. 在初始化时注入-通过init参数
  2. 通过属性注入-声明从外部设置的readwrite属性
  3. 在调用时注入-通过将依赖项传递给需要使用它的每种方法(似乎您已经想到了这一点)

现在,如果您使用情节提要板,则#1很难实现,因为您无法控制控制器初始化程序。

#2看起来是一种不错的方法,唯一的警告是您需要使用可选属性或隐式展开的属性。而且,您需要确保不要错过该属性的任何初始化,否则,如果您将该属性声明为可选,则该应用程序的行为将不正确,否则,如果将该属性声明为IUO,则该应用程序将崩溃。

#3会增加很多详细信息,如声明和在许多地方使用相同的参数。这样做的好处是您可以保证编译时能够正确执行程序(而不是#2)。

我推荐的是一个折衷的解决方案:将属性声明为readwrite,这将允许从外部注入它,但是给它一个默认值。这样,生产代码将像以前一样起作用,并且单元测试可以轻松地注入其对象:

class MyClass {
    // can be injected from outside
    // defaults to the current state
    // value namespaced to avoid name clashes, in case the global variable gets
    // renamed to lower camel case
    var appData = MyApplication.AppData
}