2011-02-03 43 views
0

我使用StructureMapNHibernate的,我想指示建立一個新的會話每次是必要的,且僅當配置工具。
我會嘗試解釋一些代碼(這是一個控制檯應用程序)。指示StructureMap創建一個新的會話(配置只有當)

我建立我的會話工廠這種方式(ConnDb是我的連接字符串):

For<ISessionFactory>() 
.Singleton() 
.Use(() => new NHSessionFactory(ConnDb, true).SessionFactory); 

,這是我用它來建立一個會話代碼:

For<ISession>() 
    .Singleton() 
    .Use(x => x.GetInstance<ISessionFactory>().OpenSession()); 

一切正常,當預期我不處理會議,但我希望能夠做到這樣的事情:

using (session) 
    { 
     using (var tx = session.BeginTransaction()) 
     { 
      // DO SOMETHING 
      tx.Commit(); 
     } 
    } 

    using (session) 
    { 
     using (var tx = session.BeginTransaction()) 
     { 
      // DO SOMETHING 
      tx.Commit(); 
     } 
    } 

我試圖改變代碼的會議,像這樣:

For<ISession>() 
    .AlwaysUnique() 
    .Use(x => x.GetInstance<ISessionFactory>().OpenSession()); 

,但我注意到,現在一個新的會話創建即使有一個活動。 在我的情況下,我引用了另一個組件(Rhino.Security),它使用服務定位器解析了ISession。

回答

1

會議應由會議的創建者而不是任何客戶處理。您應該考慮修改您的體系結構以使會話在同一範圍內創建並處理。

會話的使用期限應該被限制以適合使用它的組件。通過一次全局會話(與單例嘗試一樣),會話將持續引用您在應用程序生命週期中隨時訪問的所有實體 - 有效消耗您的內存。此外,如果您的會話引發異常,它將處於未確定狀態,並會導致您的整個應用程序停止運行。

閱讀Ayende的article in MSDN magazine關於如何在桌面應用程序中使用NHibernate。他給出的建議也適用於你的情況。

當談到使用StructureMap處理會話時,Jeremy Miller有一個blog post關於他怎麼做 - 使用嵌套容器來控制壽命。如果應用程序很簡單,Jeremy的例子可能是過度的。您可能應該專注於在應用程序中爲每個組件/命令注入一個會話。

相關問題