TBCacao 0.0.3

TBCacao 0.0.3

测试已测试
语言语言 Obj-CObjective C
许可协议 Apache 2
发布时间最新发布2015年4月

Tae Won Ha维护。



TBCacao 0.0.3

  • 作者
  • Tae Won Ha

TheobromaCacao — TBCacao

关于

TBCacao是一个小巧简单的Cocoa框架,用于依赖注入。

示例项目

我的另一个项目Qmind —— 适用于Mac OS并与FreeMind兼容的思维导图应用,广泛使用TBCacao。这是一个真实生活示例。

使用

首先,通过将其作为框架添加到您的项目中,或将所有TBCacao类复制到您的项目中,来包含TBCacao。为了初始化TBCacao,您需在返回之前将以下行添加到main.m中。

[[TBContext sharedContext] initContext];

TBBean

假设我们有两个以下类

  • MyLayoutManager
  • MyDrawingManager

进一步假设,您希望自动地将MyLayoutManager注入到MyDrawingManager中——在Spring语言中称为自动绑定。两个类的样子如下

MyLayoutManager

@interface MyLayoutManager : NSObject <TBBean>

- (void)doLayout;

@end

@implementation MyLayoutManager

- (void)doLayout {
  NSLog(@"doLayout");
}

@end

MyDrawManager

@interface MyDrawManager : NSObject <TBBean>

@property (weak) MyLayoutManager *layoutManager;

- (void)doDraw;

@end

@implementation MyDrawManager

TB_AUTOWIRE(layoutManager)

- (void)doDraw {
    [self.layoutManager doLayout];
}

@end

协议TBBean将两个类标记为组件,以便它们被TBCacao扫描。行TB_AUTOWIRE(layoutManager)TBCacao自动设置属性layoutManagerMyLayoutManager的实例。

TBManualBeanProvider

通常您在类中使用Foundation、AppKit/UIKit或其他第三方框架的单例。为了许多目的,注入它们是非常有益的,即不调用如[SomeManager sharedManager]这样的消息。这可以轻松地限制您类的单元测试性。假设您有MyManager,并且这个类使用[NSNotificationCenter defaultCenter]。为了注入默认的通知中心,您执行以下操作

MyManualBeanProvider

@interface MyManualBeanProvider : NSObject <TBManualBeanProvider>
@end

@implementation MyManualBeanProvider

+ (NSArray *)beanContainers {
    static NSArray *manualBeans;

    if (manualBeans == nil) {
        manualBeans = @[
                [TBBeanContainer beanContainerWithBean:[NSNotificationCenter defaultCenter]],
                [TBBeanContainer beanContainerWithBean:[SomeOtherManager sharedManager]],
        ];
    }

    return manualBeans;
}

@end

MyManager

@interface MyManager: NSObject <TBBean>

@property (weak) NSNotificationCenter *notificationCenter;

@end

@implementation MyManager

TB_AUTOWIRE(notificationCenter)

@end

现在,您可以在单元测试中轻松模拟MyManager的通知中心。

由于TBCacao会自动扫描实现协议TBManualBeanProvider的所有类,因此您不需要接口文件;将两个@interface@implementation放在MyManualBeanProvider.m中即可。


待描述:TB_MANUALWIRE