Objective c 带有运行时参数或工厂提供程序的Typhone注入
我对这两种能力有点困惑。两种方法都可以实现相同的功能。如果我可以用运行时参数调用一个程序集并让它吐出完全注入的对象图,那么为什么要创建一个协议并允许Typhone自动生成实现呢 在我看来,带有运行时参数的程序集应该是首选方法。有了它,如果我有多个依赖项需要注入,我就不必创建大型、冗长的构造函数 例如,我可以这样定义工厂:Objective c 带有运行时参数或工厂提供程序的Typhone注入,objective-c,dependency-injection,typhoon,Objective C,Dependency Injection,Typhoon,我对这两种能力有点困惑。两种方法都可以实现相同的功能。如果我可以用运行时参数调用一个程序集并让它吐出完全注入的对象图,那么为什么要创建一个协议并允许Typhone自动生成实现呢 在我看来,带有运行时参数的程序集应该是首选方法。有了它,如果我有多个依赖项需要注入,我就不必创建大型、冗长的构造函数 例如,我可以这样定义工厂: @protocol AWDailyDetailsPagingViewControllerFactory <NSObject> @property (nonatom
@protocol AWDailyDetailsPagingViewControllerFactory <NSObject>
@property (nonatomic, strong, readonly) AWStripViewController *stripViewController;
@property (nonatomic, strong, readonly) AWDailyDetailsDataSource *dailyDetailsDataSource;
@property (nonatomic, strong, readonly) AWLocationListViewController *locationListViewController;
@property (nonatomic, strong, readonly) id<AWPresentationController> presentationController;
@property (nonatomic, strong, readonly) AWPullToRefreshGestureHandler *pullToRefreshGestureHandler;
- (AWDailyDetailsPagingViewController *)dailyDetailsPagingViewControllerWithUserLocation:(AWUserLocation *)userLocation initialLayoutModel:(AWDailyDetailsViewControllerLayoutModel *)initialLayoutModel;
@end
- (instancetype)initWithStripViewController:(AWStripViewController *)stripViewController
dailyDetailsDataSource:(AWDailyDetailsDataSource *)dailyDetailsDataSource
locationListViewController:(AWLocationListViewController *)locationListViewController
presentationController:(id<AWPresentationController>)presentationController
pullToRefreshGestureHandler:(AWPullToRefreshGestureHandler *)pullToRefreshGestureHandler
userLocation:(AWUserLocation *)userLocation
initialLayoutModel:(AWDailyDetailsViewControllerLayoutModel *)initialLayoutModel;
- (id)dailyDetailsPagingViewControllerWithUserLocation:(AWUserLocation *)userLocation initialLayoutModel:(AWDailyDetailsViewControllerLayoutModel *)layoutModel {
return [TyphoonDefinition withClass:[AWDailyDetailsPagingViewController class] configuration:^(TyphoonDefinition* definition) {
[definition injectProperty:@selector(stripViewController) with:[self horizontalStripViewController]];
[definition injectProperty:@selector(dailyDetailsDataSource) with:[self dailyDetailsDataSource]];
[definition injectProperty:@selector(locationListViewController) with:[self.navigationAssembly locationListViewController]];
[definition injectProperty:@selector(pullToRefreshGestureHandler) with:[self.navigationAssembly pullToRefreshGestureHandler]];
[definition injectProperty:@selector(presentationController) with:[self.navigationAssembly presentationController]];
[definition injectProperty:@selector(userLocation) with:userLocation];
[definition injectProperty:@selector(layoutModel) with:layoutModel];
}];
}
但那个男孩只是有点丑。在我看来,对于运行时参数和程序集,我可以通过注入属性(我已经定义了属性)来避免该构造函数。例如,我相信我的程序集看起来像这样:
@protocol AWDailyDetailsPagingViewControllerFactory <NSObject>
@property (nonatomic, strong, readonly) AWStripViewController *stripViewController;
@property (nonatomic, strong, readonly) AWDailyDetailsDataSource *dailyDetailsDataSource;
@property (nonatomic, strong, readonly) AWLocationListViewController *locationListViewController;
@property (nonatomic, strong, readonly) id<AWPresentationController> presentationController;
@property (nonatomic, strong, readonly) AWPullToRefreshGestureHandler *pullToRefreshGestureHandler;
- (AWDailyDetailsPagingViewController *)dailyDetailsPagingViewControllerWithUserLocation:(AWUserLocation *)userLocation initialLayoutModel:(AWDailyDetailsViewControllerLayoutModel *)initialLayoutModel;
@end
- (instancetype)initWithStripViewController:(AWStripViewController *)stripViewController
dailyDetailsDataSource:(AWDailyDetailsDataSource *)dailyDetailsDataSource
locationListViewController:(AWLocationListViewController *)locationListViewController
presentationController:(id<AWPresentationController>)presentationController
pullToRefreshGestureHandler:(AWPullToRefreshGestureHandler *)pullToRefreshGestureHandler
userLocation:(AWUserLocation *)userLocation
initialLayoutModel:(AWDailyDetailsViewControllerLayoutModel *)initialLayoutModel;
- (id)dailyDetailsPagingViewControllerWithUserLocation:(AWUserLocation *)userLocation initialLayoutModel:(AWDailyDetailsViewControllerLayoutModel *)layoutModel {
return [TyphoonDefinition withClass:[AWDailyDetailsPagingViewController class] configuration:^(TyphoonDefinition* definition) {
[definition injectProperty:@selector(stripViewController) with:[self horizontalStripViewController]];
[definition injectProperty:@selector(dailyDetailsDataSource) with:[self dailyDetailsDataSource]];
[definition injectProperty:@selector(locationListViewController) with:[self.navigationAssembly locationListViewController]];
[definition injectProperty:@selector(pullToRefreshGestureHandler) with:[self.navigationAssembly pullToRefreshGestureHandler]];
[definition injectProperty:@selector(presentationController) with:[self.navigationAssembly presentationController]];
[definition injectProperty:@selector(userLocation) with:userLocation];
[definition injectProperty:@selector(layoutModel) with:layoutModel];
}];
}
现在,所有内容都包含在程序集中,在运行时,我将看到与工厂提供程序相同的结果
我在这条路上对吗?这两个功能是否提供相同的功能?大多数情况下应该使用哪一种?这有关系吗
谢谢你的评论和回答 这两个功能基本上是兼容的 出于以下原因,我们建议使用较新的运行时参数:
- 更容易配置李>
- 可以将参数向下传播到依赖项中
- 使用循环依赖项
- 不需要协议,只需要汇编接口。如果你愿意,你可以创建一个李>