我的表示层应该在NHibernate中创建会话吗?
我正在学习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
}
你会怎么做?
虽然我不是来自Web开发的WPF应用程序的专家,但我会说是的它表达层生成会话确实感觉不对。
我的建议是创建一个Factory类(我看到你用SessionManager做了)负责创建一个NHibernate Session。然后,您的业务层可以调用工厂类来获取NHibernate会话,然后在业务层中使用它来处理任何需要实现的请求。
如果您坚持IOC principles,那么您甚至可以使用和Dependency Injection注入该工厂类和业务层。
我确定你已经知道这一点,不过我会提及它: 然而,你决定分割东西,目标是保持用户界面操作代码在一层,业务代码在另一层,这样如果您需要将此应用程序移植到Web应用程序中,则可以重用业务层,并且只需要开发表示层。
看到你已经在进行单元测试,首先编写你的单元测试会迫使你自然地考虑分裂类的职责,使得它们是单元测试的,这是一件非常好的事情。我相信你走在正确的道路上。
好的答案谢谢。因此,将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