0

我正在将StructureMapNhibernate一起使用,并且我想指示该工具在每次需要时构建一个新会话,并且只有在被处置时。
我将尝试用一些代码来解释(这是一个控制台应用程序)。

我以这种方式构建我的会话工厂(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。

4

1 回答 1

1

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

会话生命周期应限制为适合使用它的组件。通过拥有一个全局会话(与您的单例尝试一样),该会话将保存对您在应用程序生命周期内任何时间访问过的所有实体的引用 - 有效地消耗您的内存。此外,如果您的会话引发异常,它将处于未确定状态,并将导致您的整个应用程序停止运行。

阅读 Ayende在 MSDN 杂志上关于如何将 NHibernate 与桌面应用程序一起使用的文章。他给出的建议很可能也适用于您的情况。

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

于 2011-02-14T14:24:40.947 回答