Dot-Net
為什麼我不應該將我的服務設為單例 (ioc)?
重要提示:請注意,我並不是指具有私有建構子和靜態實例變數(或有人建議使用靜態類)的單例,而是指在應用程序生命週期內從控制容器的反轉返回相同實例的單例。
許多容器預設使用較短的生命週期。每個依賴項(或每個請求)一個新實例,或者每個範圍一個實例(例如 HTTP 請求)。
我想知道為什麼容器推廣短命的對象而不是長命的?
請注意,我通常只在容器中註冊我的服務。如果我需要創建域模型等,我會在容器中註冊工廠。
做了一些更多的研究。
因為使用較短的生命週期時更容易處理特定於會話的資訊。混合生命週期也會使事情複雜化。
每次您在單個實例服務中使用作用域依賴項時,它都會在啟動時正常工作。但是,範圍服務通常不會被設計為長期存在的。如果他們使用諸如套接字連接或數據庫連接之類的外部資源,它可能會在某一時刻失去。
由於作用域服務不是為此而設計的,它可能會開始失敗,因此單實例服務也會開始失敗並繼續這樣做,直到重新啟動應用程序。