如何解决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 举报,一经查实,本站将立刻删除。