首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Typhoon:注入视图控制器提供程序

Typhoon:注入视图控制器提供程序
EN

Stack Overflow用户
提问于 2013-12-06 00:40:24
回答 3查看 1.1K关注 0票数 3

当使用手动容器/注入器负责创建和管理我的图中对象的生命周期时,我使用以下模式(我在ObjC中读到一篇关于DIY DI的文章):

假设我们有一个根视图控制器,它想要呈现另一个(让我们称之为详细视图控制器),并将一些数据传递给它。我通常做的是注入一个提供程序块,该提供程序块将数据作为参数,并返回一个新的视图控制器来呈现。下面是一些代码。

代码语言:javascript
复制
@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注入。

对此有什么解决方案吗?

EN

回答 3

Stack Overflow用户

发布于 2013-12-06 01:58:57

我会选择一家工厂。

这看起来有点开销,但如果你做TDD,它将极大地简化你的生活,因为你可以很容易地模拟一个工厂并在隔离中测试你的控制器。

它在台风时也能很好地工作。

票数 2
EN

Stack Overflow用户

发布于 2013-12-06 09:07:34

注入TyphoonComponentFactory的

  • 你可以在你的类中覆盖生命周期方法- (void)typhoonSetFactory:(id)theFactory。在程序集接口中,可以使用self

注入属性或参数

在任何一种情况下,您的任何TyphoonAssembly接口都可以在工厂前设置姿势。因此,例如,如果您有一个名为NetworkAssembly的程序集,则可以定义NetworkAssembly类型的属性并按此方式注入工厂。此功能的文档是here

您可以使用此方法来滚动您自己的工厂:

  • 从容器中提取静态依赖项。通过从工厂接口注入静态依赖项和运行时参数来
  • Instantiates需求组件。

带有运行时参数的台风工厂:

您的TyphoonAssembly接口现在可以实现上述模式:

示例:

代码语言:javascript
复制
- (UserDetailsController *)userDetailsControllerForUser:(User *)user
{
    return [TyphoonDefinition withClass:[UserDetailsViewController class]   
        configuration:^(TyphoonDefinition *definition) {

        [definition useInitializer:@selector(initWithPhotoService:user) 
            parameters:^(TyphoonMethod *initializer) {

            [initializer injectParameterWith:[self photoService];
           [initializer injectParameterWith:user];
        }];
    }];
}

现在解析组件:

代码语言:javascript
复制
User* aUser = self.selectedUser;
UserDetailsViewController* detailsController = 
    [assembly userDetailsControllerForUser:aUser];

此功能的文档是here

票数 2
EN

Stack Overflow用户

发布于 2014-02-20 04:50:47

您的程序集接口可以充当工厂-提供静态依赖项和运行时参数。此功能的文档是here

示例:

代码语言:javascript
复制
- (UserDetailsController *)userDetailsControllerForUser:(User *)user
{
    return [TyphoonDefinition withClass:[UserDetailsViewController class]   
        configuration:^(TyphoonDefinition *definition) {

        [definition useInitializer:@selector(initWithPhotoService:user) 
            parameters:^(TyphoonMethod *initializer) {

            [initializer injectParameterWith:[self photoService];
            [initializer injectParameterWith:user];
        }];
    }];
}

,现在解析组件:

代码语言:javascript
复制
User* aUser = self.selectedUser;
UserDetailsViewController* detailsController = 
    [assembly userDetailsControllerForUser:aUser];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20405636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档