台风 - 自动注入通过工厂定义

时间:2015-09-25 09:47:48

标签: ios objective-c dependency-injection typhoon

根据应用程序是在iPhone还是iPad上运行,我想注入一个不同的UIViewController,它们都实现了某种协议。我使用多个故事板,所以我为Typhoon创建了这个工厂定义:

- (id <DrawerProtocol>)drawerProtocol {
  return [TyphoonDefinition
    withFactory:self.storyboardAssembly.mainStoryboard
    selector:@selector(instantiateViewControllerWithIdentifier:)
    parameters:^(TyphoonMethod *factoryMethod) {
      if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        [factoryMethod injectParameterWith:StoryboardIdentifierDrawerIPhone];
      }
      else {
        [factoryMethod injectParameterWith:StoryboardIdentifierDrawerIPad];
      }
    }
    configuration:^(TyphoonFactoryDefinition *definition) {
      definition.classOrProtocolForAutoInjection = object_getClass(@protocol(DrawerProtocol));
      // Also tried:
      // definition.classOrProtocolForAutoInjection = @protocol(DrawerProtocol);
    }];
}

StoryboardAssembly提供了对this answer所示的所有故事板的引用。

当为UIViewControllers使用自动注入时,我发现必须设置definition.classOrProtocolForAutoInjection才能让Typhoon找到正确的工厂。但是,在注入协议时,我无法弄清楚如何设置此变量。

分配object_getClass(@protocol(DrawerProtocol))会产生以下异常:'NSInvalidArgumentException', reason: 'No components defined which satisify type: 'id<DrawerProtocol>''。 分配@protocol(DrawerProtocol)时,会发生这种情况:'NSInvalidArgumentException', reason: '-[Protocol isSubclassOfClass:]: unrecognized selector sent to instance

如何自动注入使用工厂实例化的协议?

0 个答案:

没有答案