是否有充分的理由反对让我的 TyphoonAssembly 成为单身人士?如果是这样,为什么?如果没有,是否有推荐的方法?
Is there a strong case against making my TyphoonAssembly a singleton? If so, why? If not, is there a recommended way to do so?
我开始使用 Typhoon
并发现继续使用额外的 assembly
参数编写构造函数很烦人。所以很容易让我的 TyphoonAssembly
成为单身人士。但是我还没有在任何示例中看到这样做,而且我确实看到了使用构造函数或 属性 注入来提供程序集的示例。所以也许有理由反对它 - 它看起来确实有点糟糕,但我不知道有多糟糕。
所以我的问题是:
- 是否有充分理由反对让我的
TyphoonAssembly
成为单身人士?
- 有没有办法在框架内做到这一点,还是我应该按照通常的方式去做?
编辑:我才刚刚开始,但假设我有一个(目前)ApplicationAssembly
,其用途如下:
- (NavigationController *)customDefaultNavigationController {
return [TyphoonDefinition withClass:[NavigationController class]
configuration:^(TyphoonDefinition *definition) {
[definition useInitializer:@selector(init)];
}];
}
- (id<IRootWireframe>)rootWireframe {
return [TyphoonDefinition withClass:[RootWireframe class]
configuration:^(TyphoonDefinition *definition) {
[definition useInitializer:@selector(init)];
}];
}
没有什么值得一提的,但关键是我的新应用程序中至少有三四个客户端仍处于 "Hello World" 功能级别。
展望未来,如果我需要编写带有程序集参数的初始值设定项,我会这样做,但如果我可以让我的 ApplicationAssembly
成为单例(或范围在一个对象中) ) 那我会的。
我认为如果您将程序集设为单例,则不会出现任何问题,但绝对没有必要这样做。您的程序集包含用于实例化对象的配方或蓝图,并且在启动时,在幕后,所有这些信息都会进入 TyphoonComponentFactory
。在这一点上,程序集本身基本上已经完成了他们的工作,现在 TyphoonComponentFactory 的责任是在被要求时构建或发出范围缓存的实例。 . .
。 .启动后,我们继续使用程序集接口,这样我们就不必诉诸 'magic strings',但这只会导致 Objective-C 消息转发到 TyphoonComponentFactory 的 componentForKey
方法。
您可以通过以下两种方式之一 bootstrap 台风(或图书馆等):
这意味着您将在整个应用程序中拥有一个 TyphoonComponentFactory 实例。
例如:
MiddleAgesAssembly *mainAssembly = [[MiddleAgesAssembly new]
activateWithCollaboratingAssemblies:@[
[QuestsAssembly new]
]];
在这种情况下,您可以根据需要保留 TyphoonComponentFactory
,对于应用程序,通常会贯穿应用程序的整个生命周期。现在我建议将它保留在应用程序委托上,尽管一旦您感到舒服,您就会发现它可以通过 proceeding from one object graph to another 隐式保留。
因此,对于引导 Typhoon 的任何一种方法,作为单例的程序集都没有任何优势。 (事实上 对于 plist 集成风格,这将被忽略)。
我开始使用 Typhoon
并发现继续使用额外的 assembly
参数编写构造函数很烦人。所以很容易让我的 TyphoonAssembly
成为单身人士。但是我还没有在任何示例中看到这样做,而且我确实看到了使用构造函数或 属性 注入来提供程序集的示例。所以也许有理由反对它 - 它看起来确实有点糟糕,但我不知道有多糟糕。
所以我的问题是:
- 是否有充分理由反对让我的
TyphoonAssembly
成为单身人士? - 有没有办法在框架内做到这一点,还是我应该按照通常的方式去做?
编辑:我才刚刚开始,但假设我有一个(目前)ApplicationAssembly
,其用途如下:
- (NavigationController *)customDefaultNavigationController {
return [TyphoonDefinition withClass:[NavigationController class]
configuration:^(TyphoonDefinition *definition) {
[definition useInitializer:@selector(init)];
}];
}
- (id<IRootWireframe>)rootWireframe {
return [TyphoonDefinition withClass:[RootWireframe class]
configuration:^(TyphoonDefinition *definition) {
[definition useInitializer:@selector(init)];
}];
}
没有什么值得一提的,但关键是我的新应用程序中至少有三四个客户端仍处于 "Hello World" 功能级别。
展望未来,如果我需要编写带有程序集参数的初始值设定项,我会这样做,但如果我可以让我的 ApplicationAssembly
成为单例(或范围在一个对象中) ) 那我会的。
我认为如果您将程序集设为单例,则不会出现任何问题,但绝对没有必要这样做。您的程序集包含用于实例化对象的配方或蓝图,并且在启动时,在幕后,所有这些信息都会进入 TyphoonComponentFactory
。在这一点上,程序集本身基本上已经完成了他们的工作,现在 TyphoonComponentFactory 的责任是在被要求时构建或发出范围缓存的实例。 . .
。 .启动后,我们继续使用程序集接口,这样我们就不必诉诸 'magic strings',但这只会导致 Objective-C 消息转发到 TyphoonComponentFactory 的 componentForKey
方法。
您可以通过以下两种方式之一 bootstrap 台风(或图书馆等):
这意味着您将在整个应用程序中拥有一个 TyphoonComponentFactory 实例。
例如:
MiddleAgesAssembly *mainAssembly = [[MiddleAgesAssembly new]
activateWithCollaboratingAssemblies:@[
[QuestsAssembly new]
]];
在这种情况下,您可以根据需要保留 TyphoonComponentFactory
,对于应用程序,通常会贯穿应用程序的整个生命周期。现在我建议将它保留在应用程序委托上,尽管一旦您感到舒服,您就会发现它可以通过 proceeding from one object graph to another 隐式保留。
因此,对于引导 Typhoon 的任何一种方法,作为单例的程序集都没有任何优势。 (事实上 对于 plist 集成风格,这将被忽略)。