TBCacao是一个小巧简单的Cocoa框架,用于依赖注入。
我的另一个项目Qmind —— 适用于Mac OS并与FreeMind兼容的思维导图应用,广泛使用TBCacao。这是一个真实生活示例。
首先,通过将其作为框架添加到您的项目中,或将所有TBCacao
类复制到您的项目中,来包含TBCacao
。为了初始化TBCacao
,您需在返回之前将以下行添加到main.m
中。
[[TBContext sharedContext] initContext];
假设我们有两个以下类
MyLayoutManager
MyDrawingManager
进一步假设,您希望自动地将MyLayoutManager
注入到MyDrawingManager
中——在Spring语言中称为自动绑定。两个类的样子如下
@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
将两个类标记为组件,以便它们被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
。