我使用 StructureMap 作为我的 IoC 容器,使用 NHibernate 作为我的 ORM。我在网上找到了一个示例,它显示了如何让 StructureMap 构建 ISessionFactory 和 ISession,因此 Factory 是一个单例,而 Session 是基于 HttpContext 的。这很好用,但后来我开始使用 NH Profiler,它告诉我应该始终明确地使用 Transactions。所以,我想,为什么不让 StructureMap 也为我处理呢?使用下面的代码,我得到了一切正常,除了,我不知道如何/在哪里提交/回滚我的事务。
这是我初始化 StructureMap 的方法:
ObjectFactory.Initialize(x =>
{
x.ForRequestedType<ISessionFactory>()
.CacheBy(InstanceScope.Singleton)
.TheDefault.Is.ConstructedBy(cfg.BuildSessionFactory);
x.ForRequestedType<ISession>()
.CacheBy(InstanceScope.Hybrid)
.TheDefault.Is.ConstructedBy(context => context.GetInstance<ISessionFactory>().OpenSession());
x.ForRequestedType<ITransaction>()
.CacheBy(InstanceScope.Hybrid)
.TheDefault.Is.ConstructedBy(context => context.GetInstance<ISession>().BeginTransaction());
x.Scan(y =>
{
y.TheCallingAssembly();
y.WithDefaultConventions();
});
});
我所有的存储库如下所示:
public UserRepository(ISession session, ITransaction transaction)
{
_session = session;
_transaction = transaction;
}
存储库中的典型方法如下所示:
public void Remove(int id)
{
Remove(_session.Get<User>(id));
}
我想要做的是让我在一个 HttpContext 中调用的所有方法共享相同的 Session 和 Transaction。这是可能的还是完全错误的,我叫错了树?
提前致谢!
-担