NHibernate,Sessions,MVVM和Repositories

时间:2014-10-26 12:18:40

标签: session nhibernate mvvm

我开始怀疑是否有人将NHibernate与WPF或Win Forms应用程序一起使用,例如缺乏关于该主题的示例或教科书。我正在努力寻找"最佳实践"使用,特别是会话和会话管理,与MVVM WPF应用程序和存储库。 要直接进入,似乎首选是为存储库提供ISession。但是,这在实例化的地方 - 在ViewModel中? - 如果是这样,这是不是在VM和NH之间造成了一种令人不舒服的依赖(或者这只是不可避免的,不管你怎么装扮它?)对多用户应用有什么影响?

使用存储库模式 - 我应该使用一个大型存储库。对于所有对象(以及因此一个会话),或者,如果看起来更易于管理,是否应该以某种逻辑业务相关的方式拆分存储库? - 但是,如果拆分,那么如何管理会话?在我的情况下,窗体/窗口不只是处理一个实体(也许它应该......?),而是多个实体。我不希望ORM方面由UI表单设计决定(也许它应该!?)

然后再次,SessionFactory - 在应用启动时在哪里,何时创建它?

对于非基于网络的NH应用程序的任何好的指针或参考将非常感激。

以下是对类似问题的引用,但它是在四年前提出的:Using Unit of Work design pattern / NHibernate Sessions in an MVVM WPF

非常感谢

1 个答案:

答案 0 :(得分:0)

我已经将NHibernate与MVVM一起使用多年了,一旦你开始使用它就很棒。 MSDN文章Building a Desktop To-Do Application with NHibernate很好地涵盖了会话管理的整个问题,绝对值得一读。

使生活变得更容易的一件事是使用良好的依赖注入框架。我个人使用Ninject,其中一件我特别喜欢的是它支持对象范围。例如,您可以使用InScope将NHibernate会话对象(以及实体存储库)设置为应用程序中的页面范围,因此给定页面层次结构中任何要求注入框架查询会话对象的内容都将获得指针同一个例子。

沿着这条路线走下去还有很多其他优势,例如,使用Castle Dynamic Proxy这样的东西很容易将属性更改通知注入到类中,以便从数据库查询中获取的实体自动支持它,因此可以直接绑定在视图中或由模型或视图模型中的其他类实例订阅。对于列表也是如此,这可能是有问题的,因为用ObservableCollection替换数据库实体列表<>可能导致数据库认为整个列表已更改,这反过来会导致性能问题,当每个实体开始将自身序列化回磁盘时,无论它是否实际更改。