我的演示层应该在NHibernate中创建一个会话吗
本文关键字:一个 会话 创建 NHibernate 我的 | 更新日期: 2023-09-27 18:20:29
我正在学习NHibernate,并创建了一些单元测试,进展非常顺利。我的主应用程序只有两层:
- 演示文稿(WPF应用程序)
- 域(具有业务逻辑和数据访问权限)
当然,我还有我的单元测试项目(test)。
我的单元测试在[TestFixtureSetup]
期间调用我的SessionManager
类来构建SessionFactory
。然后,每个[Test]
得到一个Session
来执行数据访问单元测试。我想知道我应该如何在我的WPF项目中做到这一点。
我创建了一个简单的对话框,看看我是否可以将我的WPF应用程序连接到我的数据库。在我的演示层中引用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
}
你会怎么做?
虽然我不是WPF应用程序方面的专家,但来自Web开发,我会说是的。表示层生成会话确实感觉不对。
我的建议是创建一个负责创建NHibernate会话的Factory类(我看到你用SessionManager做了这个)。然后,您的业务层可以调用工厂类来获得NHibernate会话,然后在业务层中使用它来处理需要满足的任何请求。
如果您坚持IOC原则,那么您甚至可以使用和依赖注入来注入工厂类和业务层。
我相信你已经知道了,但我还是要提一下:无论您决定如何拆分,目标都是将用户界面操作代码保留在一层,将业务代码保留在另一层,这样,如果您需要将此应用程序移植到Web应用程序,则可以重用业务层,只需要开发表示层。
既然你已经在做单元测试了,那么首先编写单元测试会迫使你自然而然地考虑以一种可以进行单元测试的方式来划分类的责任,这是一件非常好的事情。我相信你走在正确的道路上。