2016-09-19 119 views
0

我創造了Zend框架3新的應用程序,我有一個關於設計模式Zend框架3個單身

問題如果沒有太多的細節進入這個應用程序將有一些服務,如,將連接到外部API,甚至在多個數據庫中,工作流也非常複雜,一個動作可以有多個流程,取決於幾個外部信息(用戶登錄,配置等)。

我知道依賴注入和Zend Framework 3服務管理器,但是我很擔心instanciating sereval服務,當流量實際上只使用其中的一些時,我們也會根據其他服務提供服務,爲此,我正在考慮使用單身人士。

Singleton真的是一個解決方案嗎?我正在尋找Zend Framework 3中的單用戶方法,並且還沒有找到一種簡單的方法,因爲我找不到在服務中使用服務管理器的方法,因爲我無法檢索服務管理器的實例在工廠系統之外。

什麼是在Zend Framework 3中實現單例的簡單方法?

回答

2

爲什麼使用單身?

您不必擔心服務管理器中的服務太多,因爲它們只有在從服務管理器獲取服務時纔會啓動。

也不要在工廠以外的其他類中使用服務管理器。在ZF3中,出於某種原因從控制器中刪除。其中之一是可測試性。如果所有服務都注入了工廠,您可以輕鬆編寫測試。此外,如果您明年閱讀代碼,則可以輕鬆瞭解課程內需要哪些依賴關係。

如果您發現有這並不總是需要,您可以在類中被注入了太多的服務:

  • 使用ProxyManager。這個懶惰加載一個服務,但直到調用一個方法才啓動它。
  • 拆分服務:將服務中的某些部分轉移到新的服務中。例如您不需要將所有內容放在UserService中。您還可以擁有UserRegisterService,UserEmailService,UserAuthService和UserNotificationsService。

而不是ZF3,你也可以考慮zend-expressive。沒有太多細節,它是一個輕量級的中間件框架。您可以使用中間件來檢測請求所需的內容,並路由到處理請求所需的操作。像這樣的東西可能也可以在ZF3中完成,但也許別人可以解釋如何在那裏做到這一點。

+0

「也不要在除了工廠以外的其他類中使用服務管理器。」但是如果我需要創建一個具有依賴性的類的新實例呢?例如,操作模型中的對象中的不同數據,而兩個對象都是同一類。如果不能訪問服務管理器,我將不得不手動執行所有實例化過程。我仍然需要這樣的事情,但我擔心未來的問題。 –

+0

如果您需要服務中的其他服務,則需要使用構造函數注入該服務。 而且您不會操縱模型中的數據,至少在涉及其他類時不會。數據在服務類中準備並注入模型中。 如果您擔心未來需要創建的工廠數量,請不要擔心您習慣了:)稍後您將在編寫單元測試時感謝您自己。並且有[巫術技巧](https://xtreamwayz.com/blog/2015-12-30-psr7-abstract-action-factory-one-for-all),但他們有性能損失。 – xtreamwayz