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

如何解决Objective-C,Typhoon,传递一个Assembly作为参数

在我使用 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 本身的指南。因此,我在 typhoonComponentFactory 类型的 dogVC 中创建了一个属性 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 处声明的系统中的关键参与者及其与其他核心软件组件的交互。

这样:

  • 我们可以消除共享对象的重复配置。
  • 我们可以享受单例的好处,而不会过度紧密耦合。

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

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

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

工厂模式:

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

  • 获取一个包含运行时和静态依赖项的实例(即视图控制器)。

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

范围:

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

  • 默认范围是 TyphoonScopeObjectGraph
  • 要创建共享类,请使用 definition.scope = TyphoonScopeSingleton 作为文档中的 here

朝圣者:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?