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 本身的指南。所以我在类型为 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 中声明。
这样:
- 我们可以删除共享对象的重复配置。
- 我们可以在没有过度紧密耦合的情况下享受单例的好处。
在移动应用中使用依赖注入:
当我们在移动应用程序中使用依赖项注入时,我们从应用程序委托开始启动视图控制器。
- 第一个控制器将依赖一些单例服务来完成它的工作。
- 然后我们可能希望从一个视图控制器转换到另一个。我们可以加载一个由视图控制器及其依赖项组成的 'object graph'。
- 当下一个控制器出现时,我们可以释放当前控制器。
工厂模式:
要从一个控制器过渡到另一个控制器,我们可以使用 Typhoon 作为发出构建实例的工厂。工厂模式允许我们:
- 获得一个混合了运行时和静态依赖的实例(即视图控制器)。
因此,为了从一个视图控制器过渡到另一个视图控制器,我们可以注入 Typhoon 程序集以用作获取下一个视图控制器的工厂。要将程序集作为工厂注入,文档 are here.
范围:
根据导航样式,控制器通常会在使用时一直保留在内存中,然后释放。同时将共享服务或其他共享基础设施。
- 默认范围是
TyphoonScopeObjectGraph
- 要创建共享 class,请使用
definition.scope = TyphoonScopeSingleton
记录 here。
朝圣者:
至少在我看来,Typhoon 是 objective-C 最好、最灵活的 DI 库。同时,如果您使用 Swift,您可能想尝试更简单更好的方法:pilgrim.ph
在我使用 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 中声明。
这样:
- 我们可以删除共享对象的重复配置。
- 我们可以在没有过度紧密耦合的情况下享受单例的好处。
在移动应用中使用依赖注入:
当我们在移动应用程序中使用依赖项注入时,我们从应用程序委托开始启动视图控制器。
- 第一个控制器将依赖一些单例服务来完成它的工作。
- 然后我们可能希望从一个视图控制器转换到另一个。我们可以加载一个由视图控制器及其依赖项组成的 'object graph'。
- 当下一个控制器出现时,我们可以释放当前控制器。
工厂模式:
要从一个控制器过渡到另一个控制器,我们可以使用 Typhoon 作为发出构建实例的工厂。工厂模式允许我们:
- 获得一个混合了运行时和静态依赖的实例(即视图控制器)。
因此,为了从一个视图控制器过渡到另一个视图控制器,我们可以注入 Typhoon 程序集以用作获取下一个视图控制器的工厂。要将程序集作为工厂注入,文档 are here.
范围:
根据导航样式,控制器通常会在使用时一直保留在内存中,然后释放。同时将共享服务或其他共享基础设施。
- 默认范围是
TyphoonScopeObjectGraph
- 要创建共享 class,请使用
definition.scope = TyphoonScopeSingleton
记录 here。
朝圣者:
至少在我看来,Typhoon 是 objective-C 最好、最灵活的 DI 库。同时,如果您使用 Swift,您可能想尝试更简单更好的方法:pilgrim.ph