Objective-C,Typhoon,传递一个Assembly作为参数

Objective-C, Typhoon, passing an Assembly as a parameter

在我使用 Typhoon 库的应用程序中,我创建了一个 AppAssembly,它正在 SceneDelegate 中初始化,如下所示:

self.appAssembly        = [[AppAssembly new] activated];

我的 appAssembly 看起来像这样

- (Person *)me;
- (Dog *)dog;
- (Cookie *)cookie;
- (DogInteractionVC *)dogVC;
- (HowManyCookiesVC *)howManyCookiesVC;

SceneDelegate我想中转到dogVC, 然后,我想从dogVC过渡到howManyCookiesVC

SceneDelegate 调用 dogVC 的实例非常简单,因为我可以访问它:

self.viewController     = [self.appAssembly dogVC];

我不明白如何将相同的 appAssembly 实例传递给 dogVC,然后再传递给 howManyCookiesVC。当我尝试在 dogVC 中创建 AppAssembly 的实例时,我遇到了我认为称为 循环依赖的问题.

GitHub 上有一个关于注入 Assembly 本身的指南。所以我在类型为 TyphoonComponentFactorydogVC 中创建了一个 属性 appAssembly。这是我在 appAssembly 中为 dogVC 初始化方法的样子:

- (DogInteractionVC *)dogVC {
   return [TyphoonDefinition withClass:[DogInteractionVC class]
                         configuration:^(TyphoonDefinition *definition) {
      
      [definition useInitializer:@selector(initWithPerson:)
                      parameters:^(TyphoonMethod *initializer) {
         
         [initializer injectParameterWith:[self me]];
      }];
      
      [definition injectProperty:@selector(appAssembly) with:self];
   }];
}

我认为 injectProperty:@selector(appAssembly) 部分是错误的,但我花了很长时间才理解,恐怕我不能再进一步了没有社区的帮助。任何帮助表示赞赏。谢谢。

旁注: 亲爱的社区,我即将被禁止发帖,因为我最近的帖子没有受到好评。我相信这个问题有它需要的一切。如果我错了,请在放下大拇指之前告诉我,这样我才能理解我的错误。谢谢。

依赖注入:

Typhoon 有助于应用依赖注入模式——一种面向对象的软件方法,由此:

  • 关键参与者及其与系统中其他核心软件组件的交互在 composition root 中声明。

这样:

  • 我们可以删除共享对象的重复配置。
  • 我们可以在没有过度紧密耦合的情况下享受单例的好处。

在移动应用中使用依赖注入:

当我们在移动应用程序中使用依赖项注入时,我们从应用程序委托开始启动视图控制器。

  • 第一个控制器将依赖一些单例服务来完成它的工作。
  • 然后我们可能希望从一个视图控制器转换到另一个。我们可以加载一个由视图控制器及其依赖项组成的 'object graph'。
  • 当下一个控制器出现时,我们可以释放当前控制器。

工厂模式:

要从一个控制器过渡到另一个控制器,我们可以使用 Typhoon 作为发出构建实例的工厂。工厂模式允许我们:

  • 获得一个混合了运行时和静态依赖的实例(即视图控制器)。

因此,为了从一个视图控制器过渡到另一个视图控制器,我们可以注入 Typhoon 程序集以用作获取下一个视图控制器的工厂。要将程序集作为工厂注入,文档 are here.

范围:

根据导航样式,控制器通常会在使用时一直保留在内存中,然后释放。同时将共享服务或其他共享基础设施。

  • 默认范围是TyphoonScopeObjectGraph
  • 要创建共享 class,请使用 definition.scope = TyphoonScopeSingleton 记录 here

朝圣者:

至少在我看来,Typhoon 是 objective-C 最好、最灵活的 DI 库。同时,如果您使用 Swift,您可能想尝试更简单更好的方法:pilgrim.ph