当使用负责创建和管理图中对象生命周期的手工容器/注入器时,我使用以下模式(我在一篇关于 ObjC 中的 DIY DI 的文章中读到):
假设我们有一个根视图控制器想要呈现另一个(我们称之为细节视图控制器)传递一些数据给它。我通常做的是注入一个提供程序块,它将数据作为参数并返回一个新的视图控制器来呈现。这是一些代码...
@implementation RootViewController
{
UIViewController (^detailViewControllerProvider)(SomeData *someData);
}
- (id) initWithDetailViewControllerProvider:(UIViewController (^)(SomeData *someData))detailViewControllerProvider
{
//...
_detailViewControllerProvider = detailViewControllerProvider;
//...
}
// ...
- (void) presentDetailViewControllerWithData:(SomeData *)someData
{
UIViewController *detailViewController = _detailViewControllerProvider(someData);
[self presentViewController:detailViewController animated:YES completion:nil];
}
@end
我也可以使用工厂类,但这样我就可以避免创建一个新类,而只是在我的容器类中创建提供程序块。
当我想使用 Typhoon 作为 DI 容器时,问题就来了。我怎样才能使用相同的模式?在我的详细视图控制器中,我正在注入其他东西,并且我想继续使用构造函数注入,并且更喜欢它是由组件工厂创建的,而不是由我创建的。我可以创建一个工厂类来创建详细 VC,在其中(工厂)注入我稍后要在详细 VC 中注入的依赖项,但与基于块的解决方案相比,它似乎工作量太大。
我不想从根视图控制器访问我的组件工厂,也不想对 someData 使用 setter 注入。
有什么解决办法吗?