Reliant 是一个用于 Objective-C 的依赖注入(《DI》)框架,适用于 OS X 和 iOS。其目标是在不限制可能性前提下,尽可能简化使用。它旨在对项目代码影响尽可能小。它还旨在忠实于 Objective-C 的 动态本质。
在这个部分,我们将尽快让您开始使用 Reliant,如果您想了解更多(或者说,TL;DR 版),我们建议您查看我们的 wiki 页面
安装 Reliant 最简单的方法是通过 CocoaPods
将以下行添加到您的 Podfile 中
pod 'Reliant'
然后运行 pod install
或 pod update
有关 CocoaPods 的更多信息,请访问 https://cocoapods.org.cn
我们建议您首先查看我们在 快速入门 'Hello World' 教程 及其示例应用,位于 Reliant 仓库下 Examples 文件夹。
以下文档基于我们的更详尽的 示例应用,该应用也可以在 Reliant 仓库下 Examples 文件夹中找到。
您首先需要一个上下文,其中 Reliant 会查找您的特定对象。配置此类上下文的一种默认方式是通过一个配置类。示例中包含了一些这些。应用程序范围上下文通过 AppConfiguration
类进行配置。
//Header file omitted
@implementation AppConfiguration
- (id<StringProvider>)createSingletonStringProvider {
return [[DefaultStringProvider alloc] init];
}
@end
在这个非常简单的示例中,我们有一个《StringProvider》的概念,它将为我们的应用程序中各种视图生成一些字符串。我们配置Reliant创建这个字符串提供者的“单例”实例。使用依赖注入的原因是您可以避免对实现的硬依赖。这就是我们为什么有《StringProvider》协议的原因。配置将创建一个实际实现实例,但这个实例将被从实际依赖的应用程序代码中隐藏。在这种情况下,我们使用《DefaultStringProvider》。
设置上下文环境非常简单。由于我们有用于整个应用程序的上下文配置,因此我们将在这个应用程序代理中启动此上下文。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self ocsBootstrapAndBindObjectContextWithConfiguratorFromClass:[AppConfiguration class]];
}
这一行代码是最简单的设置上下文的方法。它将使用指定的配置类启动上下文,然后将该上下文绑定到self
,在这种情况下意味着您的应用程序代理。
Reliant注入配置中指定的所有对象。注入可以通过两种方式进行
为了简单起见,我们将在这几个例子中使用属性注入。
实际上,我们更喜欢初始化注入而不是属性注入,但是我们将在我们的wiki页面中详细介绍这一点。
假设我们的《DefaultStringProvider》实现需要一个《StringGenerator》来生成一些字符串。我们可以通过在《DefaultStringProvider》上简单添加一个名为stringGenerator
的属性来实现这一点。
@interface DefaultStringProvider : NSObject<StringProvider>
@property (nonatomic, strong) id<StringGenerator> stringGenerator;
@end
现在我们只需要向我们的《AppConfiguration》类添加另一个配置方法。
//Inside the implementation of our AppConfiguration
- (id<StringGenerator>)createSingletonStringGenerator {
return [[DefaultStringGenerator alloc] init];
}
有了这些,当您启动应用程序时,《DefaultStringProvider》和《DefaultStringGenerator》都在AppDelegate的上下文中被创建。记得我们说它们是以“单例”创建的吗?嗯,它们不是真正的单例,但它们在《AppDelegate》上下文中。当您请求上下文获取此对象时,它将始终返回同一实例,这是有保证的。
对于那些喜欢把属性放进匿名类扩展中的人来说,像我一样,这也会有效。
对象创建后,它将被注入它创建时所知的其他对象。所以在这种情况下,通过其stringGenerator
属性将《DefaultStringGenerator》注入到《DefaultStringProvider》中。
您成功地将《StringGenerator》与《DefaultStringProvider》类松耦合了。
有时您可能无法通过Reliant来配置您的对象。例如,视图控制器可能会由Storyboard创建,或者是由您的应用程序代码在其他地方创建的。在这些情况下,Reliant将无法自动注入您的对象。但是,注入对象仅需一行代码。
[self ocsInject];
这将基于self
找到一个上下文,然后使用找到的上下文中已知对象来注入self
。
Reliant通过给定的名称来确定注入哪些对象。在这个例子中,我们的对象名称是stringProvider
和stringGenerator
。这就是为什么我们在DefaultStringProvider
中将属性命名为这样的原因。对象的名称由您的配置器指定。在这种情况下,Reliant从方法名称中派生出名称。所有在createSingleton
之后出现的文本都被视为名称。潜在的读者可能会争辩说名称应该是StringGenerator和StringProvider(首字母大写),事实上这是真的。然而,Reliant已经为这些对象创建了camelCase形式的别名。
务必检查我们的wiki页面以了解上述讨论的更多详细信息。我们的API文档可通过cocoadocs.org获取。
如果不在GitHub上,您可以在twitter上找到我们:@AppFoundryBE或@mikeseghers。
Reliant发布在MIT许可证下。