【发布时间】:2009-10-20 15:49:44
【问题描述】:
我正在尝试掌握 NHibernate、Fluent NHibernate 和 Spring。
按照领域驱动的设计原则,我正在编写一个标准的分层 Web 应用程序,其中包括:
- 表示层 (ASP.Net)
- 一个业务层,包括:
- 一个应用层(基本上是一组对 UI 层可见的方法)
- 存储库接口和域组件(由应用层使用)
- 持久层(基本上是业务层中定义的存储库接口的实现)
我希望帮助确定一种实例化 NHibernate ISession 的方式,以便它可以在对业务层的单个请求的生命周期内由多个存储库共享。具体来说,我想:
允许在存储库实现之外控制 ISession 实例和任何事务(可能通过 IOC 框架的某些方面,拦截器?)
允许 ISession 实例以测试友好的方式提供给存储库(可能通过注入或通过一些共享的“上下文”抽象)
避免创建任何不必要的事务(即仅执行只读操作时)
请允许我编写使用 SQLLite 的测试
请允许我使用 Fluent NHibernate
允许存储库实现不了解主机环境。我还不知道业务层是否会与表示层一起在进程内运行,或者将在 WCF(在 IIS 中)下单独托管,所以我不想将我的代码绑定到 HTTP 上下文(例如)。
我第一次尝试解决这个问题是使用注册表模式;将 ISession 实例存储在 ThreadStatic 属性中。然而,随后的阅读表明这不是最好的解决方案(因为 ASP.Net 可以在页面生命周期内切换线程,我相信)。
我们将不胜感激地收到任何想法、零件解决方案、模式名称、指向最新示例 (NHibernate 2) 的指针。
【问题讨论】:
标签: nhibernate fluent-nhibernate domain-driven-design spring.net ddd-repositories