2013-01-17 35 views
1

下面是使用流利StructureMap爲什麼我的NHibernate會話僅在Windows服務中有時纔可用?

ISessionFactory sessionFactory = fluentConfig.BuildSessionFactory(); 

For<Configuration>().LifecycleIs(new HybridLifecycle()).Singleton().Use(configuration); 

For<ISessionFactory>().LifecycleIs(new HybridLifecycle()).Singleton().Use(sessionFactory); 

For<ISession>().LifecycleIs(new ThreadLocalStorageLifecycle()) 
      .Use(x => x.GetInstance<ISessionFactory>().OpenSession()); 

For<IUnitOfWork>().LifecycleIs(new ThreadLocalStorageLifecycle()) 
      .Use<UnitOfWork>(); 

的NH會話被封裝在對象的UnitOfWork NH的相關配置。

在我的窗口服務,我每次訪問會話時,它是在這樣的會議調用線程池線程中:

unitOfWork = ObjectFactory.GetInstance<IUnitOfWork>(); 
    ... 
    //Init repositories with the unitOfWork 
    //Have repos do their thing 
    ... 
unitOfWork.Commit(); 
unitOfWork.Dispose(); 

當我測試了上面的函數,它總是工作第一我啓動應用程序,但隨時隨地進行工作。它不工作的時間,這是因爲會話爲空。我發現如果在前一個通話結束後大約30秒後等待,下一次通話將會成功。

爲什麼會這樣做?我正在嘗試配置每個線程的會話?

+0

如何不作爲Windows服務運行時,它的工作原理? (即你的開發機器?) - 兩者有什麼不同? – wal

+0

@wal存儲庫代碼通常運行在Web應用程序中,但需要在Windows服務中批量處理一些數據。我在這個新環境中設置時遇到了麻煩(我沒有設置Web項目,NH和StructureMap對我來說是相當陌生的,特別是因爲大多數文檔都是如何在Web應用程序中使用它們的)。 – getit

回答

3

我會做兩件事情,

  1. 線了NLOG和輸出的窗口服務方法裏面的一些跟蹤代碼
  2. 線了NHProf並確保會話打開和周圍的UOW正常關閉。

當我遇到會話問題時,​​我發現NHProf是無價的,它從來沒有讓我失望。

您可以嘗試NHProf 30天,Nlog是OSS

相關問題