我正在学习NHibernate,并创建了一些单元测试,并且进行得非常顺利。我主要的应用程序只有两层:我的表示层应该在NHibernate中创建会话吗?
- 演示(WPF应用程序)
- 域(具有业务逻辑和数据访问)
当然,我有我的单元测试项目(测试)。
我的单元测试在[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
}
你会怎么做?
好的答案谢谢。因此,将NHibernate会话带入表示层并从那里引用NHibernate库会很好吗?我想知道是否我应该做一些类似'DAL.Repository.Save(经纪人);'或者什么的,然后Repository类创建会话等。但是然后SessionFactory的创建是昂贵的......它仍然不清楚,我和我在脑海中转圈。你知道互联网上的任何例子,说明我想要做什么?我发现更清晰的例子。 –
2012-01-17 22:26:11
嗯..不,我会做一个独立的程序集,叫做Business Layer。在业务层,我会创建一个名为BrokerService的类。代理服务将具有对SessionManager的依赖性。 BrokerService可能有一个名为AddBroker的方法,您将代理信息传递给该方法,然后该方法使用SessionManager创建一个Hybernate会话,用于将Broker实体对象保存到数据库中,但我找不到示例,但我推荐阅读DDD(域驱动设计)和IOC Inversion Of Control – 7wp 2012-01-18 21:50:29
谢谢我现在已经开始阅读Head First Design Patterns,以帮助我了解全局。 – 2012-01-19 17:07:12