2010-07-07 57 views
2

我在夏普體系結構中使用Wcf。我使用WcfSessionStorage等配置了Northwind示例後的項目。我在wcf服務中有一個方法,它使用Repository <> .GetAll()獲取業務對象列表。我正在使用WcfTestClient測試服務方法。當第一次調用該方法時,一切正常。然而在隨後的電話,我得到下面的異常的存儲庫<> .GetAll()方法NHibernate會話在每次wcf服務方法調用時都被處理掉

[System.ObjectDisposedException] 
Session is closed! 
Object name: 'ISession' 

好像NHibernate會話被每次通話後配置。我已經用下面的屬性

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class WcfService : IWcfService 
{ 
} 

然而,這意味着,該服務的一個實例會在每次調用創建這反過來將創建一個新的NHibernate會話等。在我的場景裝飾我的服務解決這個問題了沒有必要爲每個呼叫創建一個新的服務實例,我認爲它是一個昂貴的過程,而不是正確的解決方案。我想知道我的方案中的最佳做法是什麼,以及如何通過每次調用創建新的服務工作站來實現此目標。

感謝 納比爾

回答

2

最簡單的方法是每次創建新實例,它不是一個昂貴的過程,因爲在.NET中創建一個新的對象是像0.00000000000000001秒(我讀了關於Ayande的博客或某處)。

我在我的項目中使用Autofac DI,並且通常將ISession作爲容器作用域(每個請求一個)。然後,每個使用(直接或間接)ISession的類都必須是容器作用域或更低(工廠作用域==每個類使用情況都是新實例)。如果使用ISession的類是更高範圍的(會話範圍=單例),則會遇到您當前遇到的問題。

如果您的服務是單件服務: 在第一次運行時創建服務,此服務使用ISession,它應該是容器作用域,並且處於第一次運行狀態。 服務的下一個請求(服務現在已創建)仍然對創建的ISession(在前一個結束請求中已關閉)有參考,因此現在它已關閉。

我不推薦使用與打開/關閉相同的ISession(它不在NHibernate文檔中推薦),只是使用容器作用域(我做和我沒有任何性能問題),或者你應在每個方法在你的服務像手動創建的ISession:

using(ISession s = ISessionFactory.OpenSession()) 
    using(ITransaction t = .....) 
.... 

但是,這是不是很好在所有...

相關問題