C# nHibernate->;UI层中的依赖关系
我们希望利用nHibernate的“工作单元”功能。为了在我们的C#WinForms应用程序中实现这一点,我们需要在UI层中打开一个会话,即当表单打开时。执行一些工作,然后在关闭表单时关闭会话C# nHibernate->;UI层中的依赖关系,c#,nhibernate,reference,dependencies,C#,Nhibernate,Reference,Dependencies,我们希望利用nHibernate的“工作单元”功能。为了在我们的C#WinForms应用程序中实现这一点,我们需要在UI层中打开一个会话,即当表单打开时。执行一些工作,然后在关闭表单时关闭会话 这种基于表单的方法似乎非常合乎逻辑,只是我们现在需要从UI层引用nHibernate!我们应该在哪里引用nHibernate,我认为我们可以在不必从UI层中引用它的情况下完成这项工作?您需要一个会话管理器类,它将是绑定nHibernate会话的包装器。大概是这样的: public class Se
这种基于表单的方法似乎非常合乎逻辑,只是我们现在需要从UI层引用nHibernate!我们应该在哪里引用nHibernate,我认为我们可以在不必从UI层中引用它的情况下完成这项工作?您需要一个会话管理器类,它将是绑定nHibernate会话的包装器。大概是这样的:
public class SessionManager : ISessionManager
{
private readonly ISessionFactory _sessionFactory;
SessionManager()
{
_sessionFactory = CreateSessionFactory();
}
public void OpenSession()
{
ISession session = _sessionFactory.OpenSession();
session.BeginTransaction();
CurrentSessionContext.Bind(session);
}
public void CloseSession()
{
ISession session = CurrentSessionContext.Unbind(_sessionFactory);
if (session == null) return;
try
{
session.Transaction.Commit();
}
catch (Exception)
{
session.Transaction.Rollback();
}
finally
{
session.Close();
session.Dispose();
}
}
}
只需创建CreateSessionFactory方法。为什么这不符合逻辑?工作单元边界是由UI决定的,所以对我来说这听起来非常合乎逻辑。Paco,将UI作为UoW的边界是合乎逻辑的,但是在UI层中引用具体的持久性库是一种代码臭味。UI不应该知道任何关于特定实现的信息,它应该只知道UoW的概念。Ryudice基本上回答了Josata的问题。如果你在它周围创建了一个包装器,UI也知道实现,它知道包装器周围的情况,为了防止这种情况,你需要在包装器周围创建一个包装器,等等。你做了一些陈述,但没有给出任何理由。为什么投反对票?似乎是一个合适的问题,谁想要在UI层中直接引用ORM。天哪,你们是一群敏感的人!。。ISessionManager将与抽象存储库(IRepository)相邻,而SessionManager将与NHibernate存储库实现共存。不在UI层(或项目)中。