1

是否可以有一个程序集来定义基本配置并将其子类化以具有其他配置?

我正在尝试这样的事情:

@interface RootAssembly : TyphoonAssembly
- (id)abstractObject;
- (id)object;
@end


@implementation RootAssembly
- (id)abstractObject {
    return [TyphoonDefinition withClass:[NSObject class]];
}

- (id)object {
    return [TyphoonDefinition withParent:[self abstractObject] class:[NSObject class]];
}

@end


@interface ChildAssembly : RootAssembly @end

@implementation ChildAssembly
- (id)object {
    return [TyphoonDefinition withParent:[super abstractObject] class:[NSObject class]];
}
@end

如果只使用一个组件,一切正常。如果还实例化并激活了第二个,则返回的方法object尚未混合并尝试构建定义,从而导致异常:

2015-05-27 18:44:37.542 Typho[17693:8488013] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Only TyphoonDefinition object can be set as parent. But in method '(null)' object of class NSObject set as parent'

在这里查看更多信息:https ://gist.github.com/oettam/01ac812c040ed28d913c

这真的是要走的路吗?

4

1 回答 1

0

您可以定义程序集的任何子类作为原始程序集,甚至可以定义另一个类,只要它响应相同的消息即可。类似地,如果您的协作程序集由协议支持,您可以告诉 Typhoon 在启动时实现的内容是什么。

考虑:

@interface ApplicationAssembly : TyphoonAssembly

//A collaborating assembly
@property(nonatomic, strong, readonly) KernelProvider *kernelProvider;

@end

@implementation ApplicationAssembly 

- (SomeViewController*)viewController 
{
    return [TyphoonDefinition withClass:[SomeViewController class] 
      configuration:^(TyphoonDefinition *definition) {

      [definition injectProperty:@selector(something) with:_kernelProvider.service];
    ];
}

作为初创公司,您可以提供任何KernelProvider您喜欢的实现方式。

ApplicationAssembly *assembly = [[ApplicationAssembly new] 
    activateWithCollaboratingAssemblies:@[TestKernelProvider new]];

在输出中,您将看到 Typhoon 日志:

TestKernelProvider will act in place of [KernelProvider class];

这同样适用于引导 Typhoon 的plist 集成样式。只需在plist中声明每个程序集的具体实现即可。

这是你想做的事情吗?我不确定上面的例子中发生了什么,但如果你告诉我你是如何引导 Typhoon 的,那么我可以帮你看看。

于 2015-05-28T06:57:46.793 回答