2

当我开始使用 Windsor 时,我认为 DI 会很简单。现在它让我越来越困惑。

存储库给我的印象是一个具有单例生命周期的类。我应该有一个 FooRepository 的实例来在应用程序的生命周期中加载并将 Foos 保存到数据库中。

但是,每个存储库都包含对 UnitOfWork 的引用,它执行脏检查,与数据库一起工作等。 UnitOfWork 具有 PerWebRequest 的生命周期 - 将 UnitOfWork 作为单例完全没有意义,因为单例实例可以(例如)同时刷新多个用户会话所做的更改。

那么我有一个单例 FooRepository 持有对 UnitOfWork 的引用,它在会话结束时被释放!我什至不确定这会对存储库的行为产生什么影响,但这听起来不太好。

任何人都可以用简单的英语(好吧,也许用一些代码)解释在 Web 应用程序中管理 Repository 和 UnitOfWork 类的生命周期的适当方法吗?

4

2 回答 2

5

经验法则是 - 组件不应该依赖于其他会比它更长寿的组件。

换句话说,transient 可以依赖单例或每个 web-request 组件,但反之则不行。

我接近存储库的方式 - UoW 方案是我的 UoW 是每个 Web 请求,但存储库是无状态的和瞬态的。

于 2010-09-23T12:19:48.927 回答
2

当您说存储库时,我假设您的意思是抽象 Nhibernate 会话的存储库。如果是这样,那么它永远不应该是单例的。如果是单例,那么多个请求线程会互相践踏对方的会话。我个人在这方面看到了一些缺陷。由于 Castle 的默认生命周期是单例的,如果开发人员忘记显式标记组件的生命周期,坏事就会开始发生。

理想情况下,它应该是每个请求(遵循工作单元概念)。这种方法的唯一条件是您在应用程序中启用了 Asp.net 兼容模式(如果不是 Asp.net 的话)。另一种方法是标记存储库瞬态。但是这种方法的缺点是每次组件需要时,Castle 都会实例化一个新的存储库对象。

于 2011-10-05T05:44:25.243 回答