【发布时间】:2016-02-26 10:34:51
【问题描述】:
我有一个多项目 MVC 5 解决方案,其中 NHibernate 存储库在 Core.Data 类库中声明,但我的会话管理在 Wen API Core.Api 项目中。它为每个请求创建和销毁一个会话:
public override void OnActionExecuting(HttpActionContext actionContext)
{
// start a session
var session = SessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
session.BeginTransaction();
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
// commit the current session
var session = SessionFactory.GetCurrentSession();
var transaction = session.Transaction;
if (transaction != null && transaction.IsActive)
{
transaction.Commit();
}
session = CurrentSessionContext.Unbind(SessionFactory);
session.Close();
}
现在,当我在控制器操作中实例化存储库时,我希望将这个特定会话注入到存储库中。我怎样才能做到这一点?我可以做一个BaseRepository<T>: IRepository<T>,用一个构造函数找到会话,但我真的更喜欢注入它。我怎样才能做到这一点?
【问题讨论】:
-
你看过 Unity 的 PerRequestLifetimeManager 了吗?我已经在我们的项目中得到了您的要求,这一切都基于 PerRequestLifetimeManager。即,在具有“请求”生命周期的容器中注册会话,然后像往常一样从统一解析存储库/会话 - 实际上每个请求都会获得一个新会话。我可以在今天晚些时候发布更详细的答案。
-
谢谢你,@aeliusd。我可能需要更多细节。我以前从未使用过 NHibernate。
标签: asp.net-mvc session nhibernate dependency-injection unity-container