指示StructureMap创建一个新会话(仅在处置时)

时间:2011-02-03 12:27:27

标签: nhibernate structuremap rhino-security

我正在使用 StructureMap Nhibernate ,我想指示该工具每次都需要建立一个新会话,并且只有在处理完毕后才会生成。 我将尝试用一些代码解释(这是一个控制台应用程序)。

我以这种方式构建会话工厂(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 个答案:

答案 0 :(得分:1)

会话应由会话的创建者处理,而不是由任何客户处理。您应该考虑修改您的体系结构,以便在同一范围内创建和处理Session。

应限制会话生命周期以适合使用它的组件。通过一个全局会话(与您的单例尝试一样),会话将保留对您在应用程序生命周期中随时访问的所有实体的引用 - 有效地占用您的内存。此外,如果您的会话抛出异常,它将处于未确定状态并将使您的整个应用程序关闭。

阅读Ayende的article in MSDN magazine,了解如何在桌面应用程序中使用NHibernate。他给出的建议具有很高的可能性,也适用于您的场景。

当谈到使用StructureMap处理Sessions时,Jeremy Miller有一个关于他如何做的blog post - 使用嵌套容器来控制生命周期。如果应用程序很简单,Jeremy的例子可能有点过分。您可能应该专注于在应用程序中为每个组件/命令注入一个会话。