2017-09-05 48 views
3

在Symfony2中(在這種情況下爲2.8)在將服務注入到另一個服務時被認爲是最佳實踐?Symfony2中的依賴注入最佳實踐

/** 
* Checker constructor. 
* @param EntityManager $em 
* @param EventDispatcherInterface $dispatcher 
*/ 
public function __construct(EntityManager $em, EventDispatcherInterface $dispatcher) 
{ 
    $this->repoUser = $em->getRepository(User::class); 
    $this->repoPurchase = $em->getRepository(Purchase::class); 
    $this->repoTicket = $em->getRepository(Ticket::class); 
    $this->dispatcher = $dispatcher; 
} 

/** 
* Checker constructor. 
* @param UserRepository $ur 
* @param PurchaseRepository $pr 
* @param TicketRepository $tr 
* @param EventDispatcherInterface $dispatcher 
*/ 
public function __construct(UserRepository $ur, PurchaseRepository $pr, TicketRepository $tr, EventDispatcherInterface $dispatcher) 
{ 
    $this->repoUser = $ur; 
    $this->repoPurchase = $pr; 
    $this->repoTicket = $tr; 
    $this->dispatcher = $dispatcher; 
} 

,或者使用setter方法明確和services.yml單獨設置參數呢?

我想知道等式的性能部分是什麼。

+0

你可能**最好是第一個,原因是1)更靈活,如果你以後需要其他存儲庫(或減少一些),因爲你只需要觸摸該類而不是'services.yml'(這個是可辯論的,但**我認爲它更乾淨)2)ServiceContainer只需查找一個引用而不是幾個。 – ccKep

回答

7

這兩種情況都有優點和缺點。

  • 性能而言,這兩種選擇都是平等的,因爲你得到的倉庫情況下,僅當你要求你的服務的一個實例。無論你手動完成,還是由DI自動完成。由於提供了here,

    容器是懶惰的:它沒有實例化服務,直到(和除非)你問它。

  • 如果你打算用單位以支付您的服務測試 - 然後選擇2 definatelly更好,因爲你並不需要模擬$ EM-> getRepository()調用在測試開始。

  • 的好處個別安裝人員 - 也與單元測試有關。例如,對於一個測試用例,您只需要一個依賴項,即可用於另一個測試用例 - 另一個依賴項。所以,你可以在測試中使用setter來設置mock,而且你不需要將所有的mock都傳遞給構造函數。

+0

我不認爲這與mock有很大關係 - 你總是可以禁用構造函數,並且嘲諷3-4類依賴關係通常很簡單。但這只是我的意見:) –

+3

仔細查看發佈的代碼。一旦服務構建完成,回購就從實體經理中撤出。沒有性能差異。你關於單元測試和個人設置的第三點是真正擴展事物。這個類需要它的依賴關係,或者它不需要。如果某個類在某些時候只需要一些依賴關係,那麼它可能應該被重構。 – Cerad

+0

確實,在一種情況下,您需要手動提取存儲庫,在另一個DI中爲您執行此操作,但也僅在請求服務時才執行。答覆更新,感謝指點。 –