簡體   English   中英

Laravel - 服務容器中單例綁定和實例綁定的區別

[英]Laravel - difference between singleton and instance binding in service container

在 Laravel 的服務容器中,我可以同時綁定單例和實例。 來自 Laravel文檔

綁定單例

單例方法將一個類或接口綁定到應該只解析一次的容器中。 一旦解決了單例綁定,在后續調用容器時將返回相同的對象實例:

 $this->app->singleton('HelpSpot\\API', function ($app) { return new HelpSpot\\API($app->make('HttpClient')); });

綁定實例

您還可以使用 instance 方法將現有對象實例綁定到容器中。 給定的實例將始終在后續調用容器時返回:

 $api = new HelpSpot\\API(new HttpClient); $this->app->instance('HelpSpot\\API', $api);

Q1)那么這兩個概念有什么區別呢? 我能猜到對於單例綁定,Laravel 在第一次請求時通過內部服務容器機制構建對象本身,然后在后續調用中提供它,而在實例綁定的情況下,服務容器被明確地賦予一個已經構建的對象,它在每個要求?

或者還有其他解釋嗎?

Q2)為什么我們需要兩個綁定選項?

singletoninstance區別

這兩個概念非常相似。 實際上,唯一的區別是您傳入一個類/接口或一個對象。

單例文檔:

單例方法將一個類或接口綁定到應該只解析一次的容器中。 一旦解決了單例綁定,在后續調用容器時將返回相同的對象實例

實例文檔

您還可以使用 instance 方法將現有對象實例綁定到容器中。 給定的實例將始終在后續調用容器時返回

為什么我們需要兩者?

這個問題的答案可能植根於 Laravel 哲學。 從我在 Laravel 提供的大多數功能中看到的情況來看,解決問題的方法不止一種。 感覺這也是其中之一。 在某些情況下,有一些細微的差異可能會使singletoninstance使用更可取。

單例使用

使用singleton將有助於保持您的應用程序輕量級,因為如果不使用這些類/接口,則不會創建它們。

實例使用

在某些情況下,您可能已經創建了一個對象,您仍然需要將其注入到其他地方。 這就是instances用武之地。

除了@PtrTon 所說的之外,不同之處還在於創建實例的時間。 使用實例,當然,實例是在傳遞到服務容器之前創建的,這意味着它很早就創建了。 而使用單例,實例是第一次創建的,據我所知,在傳遞實例的示例之后,綁定會被解析,這可能需要相當長的時間。

暫無
暫無

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

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