[英]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)為什么我們需要兩個綁定選項?
singleton
和instance
區別這兩個概念非常相似。 實際上,唯一的區別是您傳入一個類/接口或一個對象。
單例文檔:
單例方法將一個類或接口綁定到應該只解析一次的容器中。 一旦解決了單例綁定,在后續調用容器時將返回相同的對象實例
實例文檔
您還可以使用 instance 方法將現有對象實例綁定到容器中。 給定的實例將始終在后續調用容器時返回
這個問題的答案可能植根於 Laravel 哲學。 從我在 Laravel 提供的大多數功能中看到的情況來看,解決問題的方法不止一種。 感覺這也是其中之一。 在某些情況下,有一些細微的差異可能會使singleton
或instance
使用更可取。
使用singleton
將有助於保持您的應用程序輕量級,因為如果不使用這些類/接口,則不會創建它們。
在某些情況下,您可能已經創建了一個對象,您仍然需要將其注入到其他地方。 這就是instances
用武之地。
除了@PtrTon 所說的之外,不同之處還在於創建實例的時間。 使用實例,當然,實例是在傳遞到服務容器之前創建的,這意味着它很早就創建了。 而使用單例,實例是第一次創建的,據我所知,在傳遞實例的示例之后,綁定會被解析,這可能需要相當長的時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.