2013-05-03 54 views
2

Castle.Windsor新手,只是想檢查一些東西。Castle.Windsor - 瞭解瞬態生活

我一直在閱讀關於瞬態生活方式和「釋放你的決心」 - 我爲ASP.NET MVC3應用程序創建了一個資源提供程序,並在我的新資源提供程序工廠(這是「集線器「在ASP.NET資源訪問):

IContainerAccessor accessor = HttpContext.Current.ApplicationInstance as IContainerAccessor;    
IResourceProvider provider = accessor.Container.Resolve<IResourceProvider>(new Arguments(new { resourceName = resourceName })); 

LoggerService.Information(String.Format("Tracking? {0}", accessor.Container.Kernel.ReleasePolicy.HasTrack(provider))); 

IResourceProvider是短暫的,所以我可以通過不同的resourceName給構造(所以不同的標籤,可以從不同的資源文件返回)。

我擔心我需要顯式調用這些IResourceProvider對象,但我HasTrack檢查總是返回falseRelease - 所以我想這是一件好事嗎?

容器沒有跟蹤這個對象,所以GC會(最終清理這個對象)。

當容器跟蹤這個對象時 - 如果它有創建委員會的關注?

回答

3

您只發布明確要求的組件。 有兩種明確獲取組件的方法:

a)Resolve,您在上面使用。一般來說,在您的應用程序中只有一個解決方案調用是一種很好的做法。所以你可能想看看TypedFactoryFacility。

b)使用工廠。在這種情況下,您將使用TypeFactoryFacility。如果您從工廠獲得組件,則它的相關性將在以下時間發佈:

  • 您可以通過在工廠上調用「destroy」方法來明確地釋放它。
  • 或者它自己發佈的工廠。

如果您沒有明確創建組件,則不應該釋放它。

+0

感謝Marwijn,但我已經明確要求在示例代碼中使用IResourceProvider - 但它沒有被跟蹤(我認爲這是因爲我已經解決了)。如果我使用類型化工廠,我仍然需要解決工廠問題,所以我沒有以這種方式隱藏容器(我瞭解這對工廠有利?)。但我認爲我明白了你的觀點,通過使用工廠,IResourceProvider創建的工廠擁有工廠,並在工廠發佈後立即發佈。什麼時候發佈類型工廠? – Neil 2013-05-03 15:32:37

+0

你好尼爾,有我有限的信息,我不能真正判斷你是否應該使用工廠。我只想指出,在應用程序中使用多個Resolves是一種反模式。你是對的,容器沒有理由跟蹤你的組件,因爲你沒有分離要求。但是請注意,向具有一個(如IDisposable)的資源提供程序添加依賴關係足以進行跟蹤。我的建議是在保存網站並在完成後發佈。 – Marwijn 2013-05-03 18:09:03

+0

謝謝Marwijn - 非常感謝您的意見。我認爲ASP.NET並沒有提供一個乾淨的鉤子來注入這種資源工廠這一事實並沒有幫助。基本上我試圖做一個這個http:// stackoverflow的溫莎版本。com/questions/10619962/custom-resourceproviderfactory-dependency-injection,但避免服務定位器樣式是可能的。 – Neil 2013-05-03 19:52:18

2

Thisthis blogpost詳細討論了這個話題。