C# nHibernate->;UI层中的依赖关系

C# nHibernate->;UI层中的依赖关系,c#,nhibernate,reference,dependencies,C#,Nhibernate,Reference,Dependencies,我们希望利用nHibernate的“工作单元”功能。为了在我们的C#WinForms应用程序中实现这一点,我们需要在UI层中打开一个会话,即当表单打开时。执行一些工作,然后在关闭表单时关闭会话 这种基于表单的方法似乎非常合乎逻辑,只是我们现在需要从UI层引用nHibernate!我们应该在哪里引用nHibernate,我认为我们可以在不必从UI层中引用它的情况下完成这项工作?您需要一个会话管理器类,它将是绑定nHibernate会话的包装器。大概是这样的: public class Se

我们希望利用nHibernate的“工作单元”功能。为了在我们的C#WinForms应用程序中实现这一点,我们需要在UI层中打开一个会话,即当表单打开时。执行一些工作,然后在关闭表单时关闭会话


这种基于表单的方法似乎非常合乎逻辑,只是我们现在需要从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层(或项目)中。