依赖注入 (DI) 在 iOS 开发中的应用

本文介绍如何应用依赖注入的思想,降低 iOS 代码耦合度

依赖注入(dependency injection)是一种面向对象编程中降低代码耦合度的技术。

这个技术的核心非常简单,就是对象所依赖的服务,要由接口提供注入,从而实现将这些系统服务从你编写的对象 class 里面解耦的目的。

这样做的最大好处是你写的类会将依赖剔除,变成独立的模块,所以易于复用以及测试。

在 iOS 开发中经常会使用到各种 sharedInstance,如果我们在类里面用到这些 sharedInstance,这个类就会隐含了对它的依赖:

@interface MusicPlayer
@end

@implementation
- (void)playMusic
{
    [[AVAudioSession sharedInstance] setCatgory:AVAudioSessionCategoryPlayAndRecord];
}
@end

应用依赖注入的思想,我们应该把 AVAudioSession 这个系统服务作为外部依赖,传入这个对象:

@interface MusicPlayer
@property (strong) AVAudioSession *session
@end

- (void)

- (instancetype)initWithAudioSession:(AVAudioSession *)session
{
    self = [super init];
    if (self) {
        _session = session;
    }
    return self;
}

@implementation
- (void)playMusic
{
    [self.session setCatgory:AVAudioSessionCategoryPlayAndRecord];
}
@end

这样,MusicPlayer 类将隐含对 AVAudioSession 的依赖,转换为一个注入的对象,从外部看来,可以清晰地看到这个类对 AVAudioSession 的依赖。

这时如果要测试 MusicPlayer ,就可以比较轻松传入一个 AVAudioSession 的 Mock 对象来实现测试目的。

这里只是以 AVAudioSession 为例子,事实上在项目中,我们会有各种各样的系统级、应用级自定义的公共服务,譬如:

NSNotificationCenter FileManager UserSessionManager …

这些服务都可以通过依赖注入的思想传入你编写的对象当中。

通过对依赖注入概念的理解,我们在 iOS 开发中不需要引入华丽的框架,只要在写代码的时候有这个思想,就自然会降低我们代码的耦合度。

推荐阅读:

Posted 2018-04-29

More writing at jakehao.com