【问题标题】:Appropriate lifecycle for repository classes using Castle Windsor使用 Castle Windsor 的存储库类的适当生命周期
【发布时间】:2010-09-23 09:28:22
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: castle-windsor repository-pattern lifecycle unit-of-work


    【解决方案1】:

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

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

    我处理存储库的方式 - UoW 方案是我的 UoW 是每个 Web 请求,但存储库是无状态且瞬态的。

    【讨论】:

    • 瞬态?啊,有趣。但是大概使用带有 PerWebRequest UoW 的 PerWebRequest 存储库(正如我目前正在做的那样)也可以吗? (无论如何,似乎对我有用。)
    • 无国籍是什么意思?你的意思是他们没有提到 UoW?
    • 哦,建议编辑 - '组件不应该依赖于其他组件,它会比它更长寿'。但我知道你的意思,谢谢!
    • 无状态意味着它没有自己的状态。它确实保留了对 UoW 的参考
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多