Session NHibernate、会话、MVVM和存储库

Session NHibernate、会话、MVVM和存储库,session,nhibernate,mvvm,Session,Nhibernate,Mvvm,我开始怀疑是否有人在WPF或Win Forms应用程序中使用NHibernate,这是因为缺少关于该主题的示例或教科书。我正在努力寻找使用MVVM WPF应用程序和存储库的“最佳实践”,尤其是会话和会话工厂管理。 要直接切入,似乎首选为存储库提供ISession。但是,在ViewModel中,该实例在哪里如果是这样的话,这是否在VM和NH之间产生了一种令人不舒服的依赖关系(或者这只是不可避免的,无论你如何打扮它?)对多用户应用程序有什么影响 对于存储库模式,我应该使用一个大型的repos吗。对于

我开始怀疑是否有人在WPF或Win Forms应用程序中使用NHibernate,这是因为缺少关于该主题的示例或教科书。我正在努力寻找使用MVVM WPF应用程序和存储库的“最佳实践”,尤其是会话和会话工厂管理。 要直接切入,似乎首选为存储库提供ISession。但是,在ViewModel中,该实例在哪里如果是这样的话,这是否在VM和NH之间产生了一种令人不舒服的依赖关系(或者这只是不可避免的,无论你如何打扮它?)对多用户应用程序有什么影响

对于存储库模式,我应该使用一个大型的repos吗。对于所有对象(以及一个会话),或者,乍一看似乎更易于管理,存储库是否应该以某种与业务相关的逻辑方式进行拆分但是,如果拆分,如何管理会话?在我的例子中,表单/窗口不只是处理一个实体(也许它应该…?),而是处理多个实体。我不希望ORM端由UI表单设计决定(也许应该!)

同样,SessionFactory——在哪里以及何时创建——在应用程序启动时创建一次

对于非基于网络的NH应用程序,任何好的指针或参考都将不胜感激

这里提到了一个类似的问题,但它是在四年前提出的:


非常感谢

多年来,我一直在将NHibernate与MVVM结合使用,一旦你开始使用它,那就太棒了。MSDN文章相当好地涵盖了会话管理的整个问题,绝对值得一读

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


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

感谢您的帮助回复有一个使用Ninject的好例子。给出了另一种方法(在VM基础中创建的会话)。我看过To Do样本和Ninject样本。一个永无止境的挫折是,相同且非常简单的示例不断重复,并在任何地方引用。例如,我还没有看到任何关于Ninject内核应在何处实例化的指导—这是一个现实世界的问题!没有理由说Ninject不能在自己身上施展魔法,我让内核将自己与ToInstance绑定,然后将自己注入任何需要它的东西中。(实际上,在现实世界的应用程序中,我通过接口和包装器类公开了它,但基本原理是一样的)。