【问题标题】:NHibernate, Sessions, MVVM and RepositoriesNHibernate、会话、MVVM 和存储库
【发布时间】:2014-10-26 12:18:39
【问题描述】:

我开始怀疑是否有人将 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

非常感谢

【问题讨论】:

    标签: session nhibernate mvvm


    【解决方案1】:

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

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

    走这条路还有很多其他好处,例如,使用 Castle Dynamic Proxy 之类的东西向类注入属性更改通知非常容易,这样您从数据库查询中返回的实体会自动支持它,因此可以直接绑定到视图中或由模型或视图模型中的其他类实例订阅。列表也是如此,这可能会出现问题,因为用 ObservableCollection 替换数据库实体列表可能会导致数据库认为整个列表已更改,这反过来又会在每个实体开始将自身序列化回磁盘时导致性能问题,无论是否或者它实际上没有改变。

    【讨论】:

    • 感谢您的帮助。有一个使用 Ninject here 的好例子。 This Codeplex example 提供了另一种方法(在 VM 库中创建会话)。我看过 To-Do 示例和 Ninject 示例。一种无休止的挫败感是,相同且非常简单的示例不断被重复并在任何地方引用,例如我还没有看到关于 Ninject 内核应该在哪里实例化的任何指导——这是一个现实世界的问题!
    • 没有理由 Ninject 不能自己发挥它的魔力,我让内核将自己与 ToInstance 绑定,然后将自己注入到任何需要它的东西中。 (实际上在一个真实的应用程序中,我通过接口和包装类来公开它,但基本原理是一样的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    相关资源
    最近更新 更多