簡體   English   中英

Unity RegisterInstance的IDisposable對象

[英]Unity RegisterInstance of IDisposable objects

Unity 2.0:

默認情況下,RegisterInstance使用ContainerControlledLifetimeManager。 當處置Unity容器時,它會調用實例上的Dispose(如果是IDisposable)。

在我的情況下,這不是我想要的。 該實例由另一個類擁有並處置; Unity應該只注入引用。 所以我用過:

container.RegisterInstance(instance, new ExternallyControlledLifetimeManager());

Unity文檔(在了解終身經理下)指出:

使用RegisterInstance方法注冊現有對象會產生與剛剛使用RegisterType注冊生命周期容器相同的行為。 因此,建議您在使用非默認生存期管理器時不使用RegisterInstance方法注冊現有對象,但調用RegisterInstance的線程除外。

這是什么意思?

同一部分還指出:

如果使用RegisterInstance方法注冊了對象的現有實例,則容器將為Resolve或ResolveAll的所有調用返回相同的實例,或者當依賴性機制將實例注入其他類時,前提是滿足下列條件之一:

  • 您已指定容器控制的生命周期管理器
  • 您已使用默認生命周期管理器
  • 您正在使用不同的生命周期管理器在您注冊實例的相同上下文中進行解析。

在使用RegisterInstance和ExternallyControlledLifetimeManager之后,我嘗試在另一個線程中解析,並且它工作了 - 我得到了單例實例。

我的代碼與“創建實例注冊”部分中的示例相匹配。 不過,我想確保理解背景警告。

為了清楚起見,我總是希望Unity容器注入我注冊的實例而不管線程等,我希望Unity處理它。 我這樣做了嗎?

注意ExternallyControlledLifetimeManager 您仍必須在容器外部的某個位置保留對實例的引用。 丟失引用后,您可能會丟失實例,因為ExternallyControlledLifetimeManager僅保留WeakReference 如果您沒有正常參考垃圾收集器可以收集您的實例。 檢查我博客上的示例

我覺得你很好。 所有每線程注釋僅在您使用PerThreadLifetimeManager時才有意義,而您不使用它。 這只是MSDN文章部分的笨拙措辭。

這不是標准術語,但在本文中,它們指的是由特定的終身經理定義的內容。 對於PerThreadLifetimeManager,您的上下文就是您的線程。 對於HierarchicalLifetimeManager,您的上下文是容器層次結構中的特定容器。

對於ExternallyControlledLifetimeManager,沒有特定的上下文,因此您可以完全忽略相關注釋。

作為旁注,請確保在您仍希望容器解決它們時不要丟棄實例。 如果這樣做,您的解析請求將返回與您預期不同的實例,或者拋出異常,具體取決於容器是否可以構造您的類型。

暫無
暫無

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

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