0
我有點困惑嘗試利用異議的依賴注入,爲協議屬性實例注入具體類。對於學習的目的,我做一個簡單的記錄器注入舉例如下:異議依賴注入框架 - 綁定類到協議
// Protocol definition
@protocol TestLogger<NSObject>
-(void)trace: (NSString*) message, ...;
-(void)info: (NSString*) message,...;
-(void)warn: (NSString*) message,...;
-(void)error: (NSString*) message, ...;
@end
// Concrete class definition following my protocol - note it doesn't actually use
// CocoaLumberjack yet, I just had an NSLog statement for testing purposes
@interface CocoaLumberjackLogger : NSObject<TestLogger>
@end
// Implementation section for lumberjack logger
@implementation CocoaLumberjackLogger
-(void)trace: (NSString*) message, ...
{
va_list args;
va_start(args, message);
[self writeMessage:@"Trace" message:message];
va_end(args);
}
//(note: other implementations omitted here, but are in my code)
.
.
.
@end
現在我想注入我記錄到一個視圖屬性,所以我做了以下內容:
// My test view controller interface section
@interface TestViewController : UIViewController
- (IBAction)testIt:(id)sender;
@property id<TestLogger> logger;
@end
// Implementation section
@implementation TestViewController
objection_register(TestViewController)
objection_requires(@"logger")
@synthesize logger;
.
.
.
最後我有應用模塊設置:
@interface ApplicationModule : JSObjectionModule {
}
@end
@implementation ApplicationModule
- (void)configure {
[self bindClass:[CocoaLumberjackLogger class] toProtocol:@protocol(TestLogger)];
}
@end
@implementation TestAppDelegate
@synthesize window = _window;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions
{
JSObjectionModule *module = [[ApplicationModule alloc] init];
JSObjectionInjector *injector = [JSObjection createInjector:module];
[JSObjection setDefaultInjector:injector];
return YES;
}
結果
一切似乎運行得很好,只有我的記錄器屬性是零在我的測試視圖中,當我點擊我的測試按鈕來調用記錄器語句。我希望它能夠填充具體類類型CococoaLumberJackLogger的對象。
關於我哪裏出錯的任何想法?任何幫助是極大的讚賞。謝謝!
嗯,是的,我使用的故事板,所以我認爲這是問題。我認爲這是沿着這些路線的東西,但不確定是否有辦法設置它,以便當視圖控制器從故事板實例化時,會有一種方法讓它引發噴射器被調用。感謝您的反饋。我一般是C#(最近asp mvc),並且已經使用了ninject/structuremap用於DI,我試圖應用相同的模式。我會再玩一下,再次感謝! – Sean 2012-07-20 11:33:42
如果您使用故事板,您可以做的最好的事情是讓控制器直接使用默認的噴油器。例如,logger = [[JSObjection defaultInjector] getObject:[TestLogger class]]。 – justice 2012-07-20 13:40:13
爲了跟進,我現在正在調用注入器getObject,在我注入存儲庫的控制器的viewDidLoad方法中指定了我的協議,它運行良好 - 很好,謝謝! – Sean 2012-07-30 22:40:30