2012-01-17 59 views
2

我正在学习NHibernate,并创建了一些单元测试,并且进行得非常顺利。我主要的应用程序只有两层:我的表示层应该在NHibernate中创建会话吗?

  1. 演示(WPF应用程序)
  2. 域(具有业务逻辑和数据访问)

当然,我有我的单元测试项目(测试)。

我的单元测试在[TestFixtureSetup]期间调用我的SessionManager类建立SessionFactory。然后每个[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 

    } 

你会怎么做?

回答

2

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

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

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

我确定你已经知道这一点,不过我会提及它: 然而,你决定分割东西,目标是保持用户界面操作代码在一层,业务代码在另一层,这样如果您需要将此应用程序移植到Web应用程序中,则可以重用业务层,并且只需要开发表示层。

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

+0

好的答案谢谢。因此,将NHibernate会话带入表示层并从那里引用NHibernate库会很好吗?我想知道是否我应该做一些类似'DAL.Repository.Save (经纪人);'或者什么的,然后Repository类创建会话等。但是然后SessionFactory的创建是昂贵的......它仍然不清楚,我和我在脑海中转圈。你知道互联网上的任何例子,说明我想要做什么?我发现更清晰的例子。 – 2012-01-17 22:26:11

+0

嗯..不,我会做一个独立的程序集,叫做Business Layer。在业务层,我会创建一个名为BrokerService的类。代理服务将具有对SessionManager的依赖性。 BrokerService可能有一个名为AddBroker的方法,您将代理信息传递给该方法,然后该方法使用SessionManager创建一个Hybernate会话,用于将Broker实体对象保存到数据库中,但我找不到示例,但我推荐阅读DDD(域驱动设计)和IOC Inversion Of Control – 7wp 2012-01-18 21:50:29

+0

谢谢我现在已经开始阅读Head First Design Patterns,以帮助我了解全局。 – 2012-01-19 17:07:12

相关问题