簡體   English   中英

Objective-C,台風,將程序集作為參數傳遞

[英]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 上有一個關於注入程序集本身的指南。 所以我在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)是錯誤的,但我花了很長時間才理解這一點,而且如果沒有社區的幫助,恐怕我不能再進一步 go。 任何幫助表示贊賞。 謝謝你。

旁注:親愛的社區,我非常接近被禁止發帖,因為我最近的帖子沒有受到好評。 我相信這個問題有它需要的一切。 如果我錯了,請在豎起大拇指之前讓我知道,以便我理解我的錯誤。 謝謝你。

依賴注入:

Typhoon 有助於應用依賴注入模式 - 一種面向 object 的軟件方法,其中:

  • 關鍵參與者及其與系統中其他核心軟件組件的交互 a 在組合根中聲明。

這樣:

  • 我們可以刪除共享對象的重復配置。
  • 我們可以在沒有過度緊耦合的情況下享受單例的好處。

在移動應用程序中使用依賴注入:

當我們在移動應用程序中使用依賴注入時,我們從應用程序委托開始啟動視圖 controller。

  • 第一個 controller 將依賴一些 singleton 服務來完成其工作。
  • 然后我們可能希望從一個視圖 controller 轉換到另一個視圖。 我們可以加載一個由視圖 controller 及其依賴項組成的“對象圖”。
  • 當下一個 controller 出現時,我們可以發布當前的一個。

工廠模式:

要從一個 controller 過渡到另一個,我們可以使用 Typhoon 作為發射構建實例的工廠。 工廠模式允許我們:

  • 獲取一個混合了運行時和 static 依賴項的實例(即視圖控制器)。

因此,要從一個視圖 controller 過渡到另一個視圖,我們可以注入 Typhoon 組件用作工廠以獲得下一個視圖 controller。 要將程序集作為工廠注入,文檔在這里

范圍:

根據導航風格,控制器通常會保留在 memory 只要使用然后釋放。 同時將共享服務或其他共享基礎設施。

  • 默認的 scope 是TyphoonScopeObjectGraph
  • 要創建共享 class 使用definition.scope = TyphoonScopeSingleton ,如此所述。

朝聖:

至少在我看來,Typhoon 是 objective-C 最好和最靈活的 DI 庫。 同時,如果您使用 Swift,您可能想嘗試更簡單更好的: pilgrim.ph

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM