2011-02-03 44 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的例子可能是过度的。您可能应该专注于在应用程序中为每个组件/命令注入一个会话。

相关问题