12

我想我陷入了分析的瘫痪。请帮忙!

我目前有一个项目

在我的案例中,工作单元实现一次支持一个 NHibernate 会话。我当时认为这是有道理的;它从 ViewModel 中隐藏了 NHibernate 会话的内部工作。

现在,根据 Oren Eini (Ayende) 的说法:http: //msdn.microsoft.com/en-us/magazine/ee819139.aspx

他说服观众当与演示者/视图模型关联的视图被释放时,NHibernate 会话应该被创建/释放。他提出了为什么您不希望每个 Windows 应用程序一个会话,也不希望每个事务创建/处置一个会话的问题。不幸的是,这带来了一个问题,因为我的 UI 很容易在一个应用程序中出现 10 多个视图/视图模型。他正在使用 MVP 策略进行演示,但他的建议是否可以转化为 MVVM?

这是否意味着我应该放弃工作单元并让 viewmodel 直接创建 NHibernate 会话?WPF 应用程序一次应该只有一个工作会话吗?如果这是真的,我应该什么时候创建/处置 NHibernate 会话?

而且我还没有考虑过 NHibernate 无状态会话如何适应这一切!我的大脑要爆炸了。请帮忙!

更新:

我在 Rhino Tools 中找到了 Ayende 的工作单元实现。我发现他的实现和我做的有很大的不同。他绝对支持多个会话。经过进一步研究,我认为最好执行以下操作:

  • 废弃我对工作单元的实施
  • 辞职以直接从视图模型中使用 NHibernate 的 ISession 和 IStatelessSession 对象。虽然在我看来它并不理想,但我已经在 Unit of Work 上花费了太多时间,而且它并没有达到现在的效果。必须在某个时候应用 KISS 和 YAGNI。Ayende 的文章和其他一些人指出直接使用这些是可以的,我至少可以感到安慰。
  • 如果我真的不想暴露 ISession,我总是可以使用 Castle.ActiveRecord,但我认为这没有必要。
  • 我可以重用会话工厂代码,所以工作单元的实现并不是完全浪费。
  • 重构我的存储库以允许注入 StatelessSession 和 Session,并在可用时使用无状态:否则使用常规会话。

毕竟,我可以应用每个视图模型打开一个会话/无状态会话的策略,当视图被处置时,让视图模型刷新/处置会话/无状态会话。

听起来像是个计划?

4

4 回答 4

3

我知道这可以追溯到不久前,但我已经在网上寻找了 3 天的体面答案。我阅读了您提到的两个博客,查看了 Nhibernate 3.0 食谱,其中他们还讨论了 MVP 应用程序中的 Nhibernate,但这并不完全适合我的 MVVM 上下文与存储库和使用 Ninject for IoC。

我发现这个旧帖子到目前为止是最有用的页面: http ://www.emidee.net/index.php/2010/08/23/ninject-use-one-database-session-per-view -模型

我希望这对将来偶然发现这个问题的人有所帮助。

于 2012-05-15T15:53:41.117 回答
2

您对 10 多个会话处于活动状态的真正担忧是什么?会话是可用于重量级操作的轻量级对象。如果会话当前没有做任何事情,那是微不足道的。

于 2010-04-09T07:00:21.360 回答
1

在客户端应用程序中使用 UnitOfWork 受到严重限制,因为所有延迟加载都会中断。你失去了 NHibernate 擅长的部分内容。您还为运行时异常设置了自己,因为 NHibernate 模型中没有任何内容提醒您不要使用这些功能。我会说 Ayendes 的建议很好。

于 2010-04-09T07:58:12.990 回答
0

就我个人而言,我尽量让会话保持开放的时间尽可能短。主要原因是我们在主聚合根上使用悲观锁定(我们正在使用域驱动设计),因此我们希望尽快释放锁定。不要忘记,由于您使用的是 NHibernate 客户端,因此您可以关闭会话,当您打开一个新会话时,您可以重新连接断开的实体。

就个人而言,即使在一个同时打开许多窗口/标签的应用程序中,我仍然一次只使用一个会话。当我需要为视图检索数据或需要保留更改时,我会打开一个新的。

在我们当前的应用程序中,有一次我们在工作单元中实现了多会话支持,但是当我们意识到我们对它没有任何用处并且它只是使事情变得复杂时最终将其取消。

于 2010-07-14T14:52:58.960 回答