我正在切换CoreData
堆栈以使用依赖项注入,而当它开始组合在一起时,我一直试图将托管对象上下文传递到我的一个类中。这是一个具有许多方法的类,许多称为ApplicationData()
的其他类都使用该方法。可通过以下在类定义之外定义的内容对其进行访问:
var AppData = ApplicationData()
其他类的典型用法如下:
AppData.uploadRecords()
问题是,没有安全隐患,我不确定如何注入托管对象上下文。我想我可以在每个ApplicationData
方法中都包含一个托管对象上下文变量。但是使用依赖注入的全部目的是尝试“正确”地做事。谢谢!
答案 0 :(得分:1)
最常用的三种类型的DI:
现在,如果您使用情节提要板,则#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
}