2013-05-04 32 views
0

我使用Unity,Prism構建解耦應用程序。

我擔心的問題是服務中的資源管理問題。在例子中更容易解釋: 想象一下,w有一些接口IDataRetriever,它爲我們提供了某種數據。實現被註冊爲一個實例。 這個接口的實現可以基於任何東西:Files(FileDataRetriever),Sql Server(SqlServerDataRetriever),甚至簡單的Dictionary。配置使用的具體實現(可能通過配置文件,但沒關係)。

一旦應用程序完成工作,取決於服務實現它應該有時釋放資源(例如關閉連接,關閉文件等)或不(例如,當使用詞典),但因爲我與解耦抽象工作我不知道這兩件事: 1.何時釋放資源 2.具體實現是否需要資源釋放。解耦應用程序中的資源管理

我可以想到引導程序將實現IDisposable時的場景,並檢查每個服務的IDisposable實現,並且還爲所有模塊調用Dispose(這意味着所有模塊都必須實現IDisposable),但它只是沒有'看起來像處理這種事情的正確方式(太複雜)?

回答

1

您可能會決定,只要您的數據檢索器完成其操作,就可以(並且實際上最好)釋放資源。在這種情況下,釋放資源將隱含在對您的GetData或您的客戶端代碼使用的抽象的一部分的等效方法的調用中。

或者,如果您不希望在檢索數據之後才發佈資源,那麼您需要在抽象中公開Release或等效方法。如果服務不需要它,則強制服務實現此方法很麻煩,因此您可以將此方法放置在單獨的界面上,並且僅針對相應的服務實施此方法。

然後,客戶端代碼可以檢查注入的服務是否在適當的時間實現了此接口,並在適當的情況下調用Release方法。

+0

每次操作後釋放資源實際上是不可能的。 使用Release方法實現接口,我相信和實現IDisposable一樣,我在第一篇文章中描述過。我目前正在考慮終結者,它看起來不是正確的地方使用它們嗎? – 2013-05-04 10:26:23

+1

您不應在終結器中調用Dispose或Close,請參閱http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection.close%28v=VS.85%29.aspx。這似乎並不適用於此。你可以使用IDisposable yes,只需要它的類型,然後在客戶端進行測試。 – devdigital 2013-05-04 10:33:38

相關問題