Objective c 目标依赖注入框架-将类绑定到协议

Objective c 目标依赖注入框架-将类绑定到协议,objective-c,dependencies,protocols,code-injection,Objective C,Dependencies,Protocols,Code Injection,我在尝试利用异议进行依赖项注入时有点困惑,为协议属性实例注入一个具体的类。出于学习目的,我制作了一个简单的记录器注入示例,如下所示: // Protocol definition @protocol TestLogger<NSObject> -(void)trace: (NSString*) message, ...; -(void)info: (NSString*) message,...; -(void)warn: (NSString*) message,...; -(void)

我在尝试利用异议进行依赖项注入时有点困惑,为协议属性实例注入一个具体的类。出于学习目的,我制作了一个简单的记录器注入示例,如下所示:

// 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
结果

一切似乎都运行得很好,当我单击我的测试按钮调用logger语句时,只有我的logger属性在我的测试视图中是nil。我希望它会被一个具体类类型的对象CocoCalumberJackLogger填充

你知道我哪里出错了吗?非常感谢您的帮助。谢谢

肖恩

什么负责初始化TestViewController?TestViewController的初始化必须委托给喷油器


例如,如果NIB负责实例化它,那么记录器将为零,因为NIB不了解TestViewController的依赖关系。

Hmm,是的,我正在使用故事板,所以我假设这就是问题所在。我一直认为这是一种类似的东西,但不确定是否有一种方法可以设置它,以便在从故事板实例化视图控制器时,有一种方法可以让它导致调用注入器。谢谢你的反馈。我通常是一名C#(最近是asp mvc)&在DI中使用了ninject/structuremap,我试图应用相同的模式。我会玩一会儿,再次谢谢!如果您使用的是故事板,那么最好让控制器直接使用默认的注入器。例如,logger=[[JSDefaultInjector]getObject:[TestLogger class]]。接下来,我将调用injector getObject,在注入存储库的控制器的viewDidLoad方法中指定我的协议,它工作正常-很好,谢谢!您的代码是否托管在某个地方?或者你可以发布一个要点,让其他人可以从你的解决方案中受益。谢谢
// 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;
}