我的表示层应该在NHibernate中创建一个会话吗?

时间:2012-01-17 18:30:55

标签: c# wpf nhibernate

我正在学习NHibernate,并且已经创建了一些单元测试,并且进展顺利。我的主应用程序只有两层:

  1. 演示文稿(WPF应用程序)
  2. 域(具有业务逻辑和数据访问权)
  3. 当然我有我的单元测试项目(测试)。

    我的单元测试会在SessionManager期间致电我的SessionFactory课程以构建[TestFixtureSetup]。然后,每个[Test]获得Session来执行数据访问单元测试。我想知道如何在我的WPF项目中这样做。

    我创建了一个简单的对话框,看看我是否可以将我的WPF应用程序连接到我的数据库。在我的Presentation层中引用NHibernate感觉不对,我对这种感觉是对的吗?如果是这样,当用户点击表单上的Add来存储内容时,我应该如何获得存储对象的会话?这是我的一些代码:

    public class SessionManager
    {
        private ISessionFactory _sessionFactory;
    
        public SessionManager()
        {
            _sessionFactory = GetSessionFactory();
        }
    
        public ISession GetSession()
        {
            return _sessionFactory.OpenSession();
        }
    
        private ISessionFactory GetSessionFactory()
        {
            return (new Configuration()).Configure().BuildSessionFactory();
        }
    }
    

    在我的测试项目中,我有这样的事情:

        [TestFixtureSetUp]
        public void TestFixtureSetup()
        {
            log4net.Config.XmlConfigurator.Configure();
            DatabaseFixtureSetUp();
            _sessionManager = new SessionManager();
        }
    
        [SetUp]
        public void Setup()
        {
            DatabaseSetUp();
    
            _session = _sessionManager.GetSession();
        }
    

    我不确定如何构建我的表示层代码来存储对象。我的表格上有这个:

        private void btnAddBroker_Click(object sender, RoutedEventArgs e)
        {
            var broker = new Broker
            {
                Name = txtBrokerName.Text,
                IsActive = (bool)chkIsActive.IsChecked,
                IsDefault = (bool)chkIsDefault.IsChecked
            };
    
            // save the broker object to the database
            // is it ok to have NHibernate code here? feels wrong
    
        }
    

    你会怎么做?

1 个答案:

答案 0 :(得分:2)

虽然我不是WPF应用程序的专家,来自Web开发,我会说是的,表示层生成会话确实感觉不对。

我的建议是创建一个Factory类(我看到你用SessionManager做的),它负责创建一个NHibernate会话。然后,您的业务层可以调用工厂类来获取NHibernate会话,然后在业务层中使用它来处理需要满足的任何请求。

如果你坚持Dependency Injection,你甚至可以使用和IOC principles注入工厂类和业务层。

我相信你已经知道了,但无论如何我都会提到它: 但是,您决定拆分,目标是将用户界面操作代码保留在一个层中,将业务代码保存在另一个层中,这样,如果您需要将此应用程序移植到Web应用程序,那么业务层可以重新使用,只需要开发表示层。

看到你已经在进行单元测试,首先编写单元测试会迫使你自然地考虑以可以单元测试的方式分离类的职责,这是一件非常好的事情。我相信你走的是正确的道路。