依赖于 2.4.0

Reliant 2.4.0

测试已测试
语言语言 Objective-CObjective C
许可 MIT
发布最后发布2016年6月

Mike SeghersJoris Dubois 维护。



Reliant 2.4.0

  • Mike Seghers

Reliant 是一个用于 Objective-C 的依赖注入(《DI》)框架,适用于 OS X 和 iOS。其目标是在不限制可能性前提下,尽可能简化使用。它旨在对项目代码影响尽可能小。它还旨在忠实于 Objective-C 的 动态本质。

入门指南

在这个部分,我们将尽快让您开始使用 Reliant,如果您想了解更多(或者说,TL;DR 版),我们建议您查看我们的 wiki 页面

安装

安装 Reliant 最简单的方法是通过 CocoaPods

将以下行添加到您的 Podfile 中

pod 'Reliant'

然后运行 pod installpod update

有关 CocoaPods 的更多信息,请访问 https://cocoapods.org.cn

快速入门教程

我们建议您首先查看我们在 快速入门 'Hello World' 教程 及其示例应用,位于 Reliant 仓库下 Examples 文件夹。

使用 Reliant

以下文档基于我们的更详尽的 示例应用,该应用也可以在 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通过给定的名称来确定注入哪些对象。在这个例子中,我们的对象名称是stringProviderstringGenerator。这就是为什么我们在DefaultStringProvider中将属性命名为这样的原因。对象的名称由您的配置器指定。在这种情况下,Reliant从方法名称中派生出名称。所有在createSingleton之后出现的文本都被视为名称。潜在的读者可能会争辩说名称应该是StringGeneratorStringProvider(首字母大写),事实上这是真的。然而,Reliant已经为这些对象创建了camelCase形式的别名。

进一步阅读

务必检查我们的wiki页面以了解上述讨论的更多详细信息。我们的API文档可通过cocoadocs.org获取。

联系

如果不在GitHub上,您可以在twitter上找到我们:@AppFoundryBE或@mikeseghers。

许可证

Reliant发布在MIT许可证下。