TBCacao 是一个简单小巧的 Cocoa 框架,用于依赖注入。
我的其他项目 Qmind —— 兼容 FreeMind 的 OS X 思维导图应用 —— 广泛使用了 TBCacao。看看一个真实示例。
首先,通过将其添加为 Framework 或将所有 TBCacao
类复制到您的项目中,将 TBCacao
包含到您的项目中。在您返回之前,将以下行添加到 main.m
中以初始化 TBCacao
[[TBContext sharedContext] initContext];
假设我们有以下两个类
MyLayoutManager
MyDrawingManager
进一步假设您想在 MyDrawingManager
中自动注入(在 Spring 中的语言叫做自动装配)MyLayoutManager
。两个类如下所示
@interface MyLayoutManager : NSObject <TBBean>
- (void)doLayout;
@end
@implementation MyLayoutManager
- (void)doLayout {
NSLog(@"doLayout");
}
@end
@interface MyDrawManager : NSObject <TBBean>
@property (weak) MyLayoutManager *layoutManager;
- (void)doDraw;
@end
@implementation MyDrawManager
TB_AUTOWIRE(layoutManager)
- (void)doDraw {
[self.layoutManager doLayout];
}
@end
TBBean
协议将两个类标记为 bean,以便它们被 TBCacao
扫描。行 TB_AUTOWIRE(layoutManager)
使 TBCacao
自动将 layoutManager
属性设置为 MyLayoutManager
的实例。
您通常在类中使用 Foundation、AppKit/UIKit 或其他第三方框架的单例。为了许多目的,将它们注入是有益的,即不调用类似 [SomeManager sharedManager]
的消息。这可以轻松限制您类的能力单元测试。假设您有 MyManager
并且这个类使用 [NSNotificationCenter defaultCenter]
。要注入默认的通知中心,您可以这样做
@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
@interface MyManager: NSObject <TBBean>
@property (weak) NSNotificationCenter *notificationCenter;
@end
@implementation MyManager
TB_AUTOWIRE(notificationCenter)
@end
现在,您可以在对 MyManager
的单元测试中轻松模拟通知中心。
由于 TBCacao
会自动扫描所有实现协议 TBManualBeanProvider
的类,您不需要接口文件;将 @interface
和 @implementation
都放在 MyManualBeanProvider.m
中。
待定:描述 TB_MANUALWIRE
。