DI Singleton 实例与 Transient 实例

DI Singleton instance vs Transient instance

几年前,IoC 性能指南指出 IoC 容器应该只用于解析长期存在的实例(基本上是单例),而瞬态类型对象应该使用单例工厂(由容器持有)创建。

我现在正在阅读有关 ASP.NET Core 的内容,以及我看到的几个示例将 Transient 生命周期用于注入的对象。 transient 现在是提供静态方法(并且是无状态的)服务的首选方法,有什么变化吗?

没有任何变化。

我不确定你在哪里读到的,但是 do note that a service cannot have a lifetime shorter than the services that depend on it。因此,如果您将服务注入单例,那么您的想法是正确的——在这种情况下,您可能需要一个工厂才能正确释放实例。

但是,由于 ASP.NET Core 在每次请求时都会解析控制器实例,所以注入瞬态依赖性很好,因为当控制器被销毁时它会超出范围。

"long-lived instances" 的概念并没有说明每个人的一生或生活方式,而是从消费者的角度来看,只有一个例子。他们无国籍

换句话说,"long-lived instances" 指的是 servicesdependencies,而 "short-lived instances" 指的是数据-中心对象,例如实体、DTO、消息和视图模型。

这些服务由您的 Composition Root(通常但不一定是您的 DI 容器)创建和管理,而以数据为中心的对象直接由应用程序代码管理。换句话说,那些 "long-lived objects" 是由 Composition Root 'newed' 更新的,而 "short-lived objects" 是由应用程序代码本身更新的。

那些以数据为中心的对象是易变的,它们通常只在请求的持续时间内存在(甚至更短),尽管它们可能会被缓存并在应用程序存在时一直存在。

依赖项也可以存在很短的时间,但通常是在请求期间。