我想我陷入了分析的瘫痪。请帮忙!
我目前有一个项目
- 在 SQLite 上使用 NHibernate
- 实现存储库和工作单元模式:http ://www.nhforge.org/wikis/patternsandpractices/nhibernate-and-the-unit-of-work-pattern.aspx
- WPF 应用程序中的 MVVM 策略
在我的案例中,工作单元实现一次支持一个 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,并在可用时使用无状态:否则使用常规会话。
毕竟,我可以应用每个视图模型打开一个会话/无状态会话的策略,当视图被处置时,让视图模型刷新/处置会话/无状态会话。
听起来像是个计划?