【问题标题】:Autofac - does lifetime scope use root scope instance if it exists?Autofac - 如果存在,生命周期范围是否使用根范围实例?
【发布时间】:2016-11-03 09:13:24
【问题描述】:

这可能是一个菜鸟问题。

假设我需要在 web 请求处理中解析一些接口,比如 IFunctional,该接口在 autofac 配置中注册为每个生命周期范围内的实例。但在我这样做之前,我已经解决了注册为单个实例并且还依赖于 IFunctional 的 IService。因此,IService 已经在根范围内解析,IFunctional 也已经在根范围内解析。现在尝试解决 IFunctional 中的 Web 请求处理,会不会:

  1. 在“Web 请求范围”中创建新的 IFunctional 实例
  2. 在作用域树中查找 IFunctional 的实例并在根作用域中找到一个并使用该实例?

对我来说,第一个选项更有意义,但我宁愿确定。谢谢!

【问题讨论】:

    标签: autofac


    【解决方案1】:

    在您的情况下: IService(单例)具有 IFunctional(每生命周期)。所以这个 IFunctional 对象将与 IService 一起存在。但是其他类不会使用这个IFunctional。简而言之:这个 IFunctional 只会被 IService 使用。

    当请求开始时,新的请求生命周期范围也开始了。因此,当您尝试在此范围内解析/获取 IFunctional 对象时,它会检查 我的范围内是否有任何 IFunctional 对象?。如果没有,它会创建一个新的。否则,它使用在此范围内的 IFunctional,而不是在其他范围内,即使在根目录中也是如此(因为 IFunctional 不是单例)。

    因此,第一个选项会发生。

    【讨论】:

    • 感谢您的快速答复!这破坏了我的不安全感:)
    • 我不建议你在单例中终生使用。它可能会破坏您的设计。另外,如果它们是一次性的,它可能非常危险。因为 perlifetime 在你期望它开始和结束的单词中。使用工厂或遵循 SRP。可能是 IService 根本不需要 IFunctional 可能只需要一些可以是单例或每个依赖的部分。
    • 不太明白那部分。您是否指出在单个实例对象中使用每个生命周期依赖项可能是危险的,因为每个生命周期对象实际上将与单个实例一样长?如果有一个绑定资源,它将在整个程序生命周期中保留?假设日志服务(单例)需要事务服务(每个生命周期)来写入数据库。对我来说似乎没有那么危险。如果您进行大量日志记录,则按依赖方式进行可能效率低下。从 SRP 的角度来看,这似乎也不错,因为我相信 SRP 指的是类而不是实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多