DI Singleton实例与Transient实例

时间:2018-01-16 18:22:50

标签: c# .net dependency-injection inversion-of-control

几年前,IoC性能指南规定IoC容器应仅用于解析长寿命实例(基本上是单例),而瞬态类型对象应使用单件工厂(由容器保存)创建。

我现在正在阅读有关ASP.NET Core的内容,我见过的一些示例使用了Transient生命周期来处理它们的注入对象。如果瞬态现在是提供静态方法(并且是无状态)的服务的首选方法,那么有什么改变吗?

2 个答案:

答案 0 :(得分:3)

"长寿命实例的概念"没有说明他们的生活或生活方式,但从消费者的角度来看,只有一个例子。他们是无国籍

换句话说,"长期存在的实例"指的是服务依赖,而"短期实例"指以数据为中心的对象,例如实体,DTO,消息和视图模型。

这些服务由您的Composition Root创建和管理(通常,但不是您的DI容器),而以数据为中心的对象由应用程序代码直接管理。换句话说,那些"长寿命的物体"是新生的'由组合根组成,而"短命对象"由应用程序代码本身新建。

这些以数据为中心的对象是易变的,它们通常仅在请求期间(或甚至更短)存在,尽管它们可能会在应用程序存在的时候被缓存并存活。

依赖关系也可以持续很短的时间,但通常是在请求期间。

答案 1 :(得分:2)

没有任何改变。

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

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

相关问题