【发布时间】:2018-06-25 12:50:20
【问题描述】:
几年前,IoC 性能指南指出,IoC 容器应仅用于解析长期存在的实例(基本上是单例),而瞬态类型对象应使用单例工厂(由容器保存)创建。
我现在正在阅读有关 ASP.NET Core 的信息,并且我看到的几个示例将瞬态生命周期用于注入的对象。瞬态现在是提供静态方法(并且是无状态)的服务的首选方法,是否发生了一些变化?
【问题讨论】:
-
“几年前 IoC 性能指南已声明”。你有这个的来源吗?据我所知,这不是一个共同的指导方针。 The book 肯定不建议这样做。
-
我想大多数人都发现,与必须确保单例永远不会捕获生命周期较短的服务相比,不断创建新服务对象的性能开销并不是什么大问题.将所有事情都从短暂的开始更容易,并且只有在有令人信服的理由时才会偏离。
-
@StriplingWarrior 我的经验实际上是相反的。制作完整的对象图单例具有消除许多常见陷阱(如 Captive Dependencies)的奇妙好处,并迫使您进入严格的无状态模型。我遇到过我周围的其他人发现 Singleton 是一种更直观的模型,尤其是对于没有 DI 经验的开发人员。它确实需要通过环境状态存储有状态对象(如 DbContext),但仍然比查找 Captive Dependencies 简单得多。
-
@Steven:有趣的是,您发现单例减少了强制依赖的发生。当我过去使用默认单例时,我经常有捕获依赖项,因为 dependent 类必须意识到其依赖项的生命周期(一种紧密耦合的形式),而瞬态-默认意味着只有需要更长生命周期的类才需要避免捕获它们的依赖项。我还发现瞬态作用域强制使用无状态模型,而单例作用域会诱使开发人员在私有字段中维护状态。
-
我的发现完全相反。单例不需要私有字段中的状态,尽管它确实需要环境状态作为组合根的一部分。我的经验是,开发人员检测有状态服务(单例存在问题)比检测 Captive Dependencies 要容易得多。
标签: c# .net dependency-injection inversion-of-control