我正在将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。