MST

星途 面试题库

面试题:C#使用依赖注入时如何处理生命周期管理

在C#应用依赖注入时,不同的依赖对象可能需要不同的生命周期管理策略,如单例、瞬时、作用域等。请详细说明在常见的依赖注入框架(如.NET Core内置的依赖注入框架)中,如何配置和管理这些不同的生命周期,同时分析不同生命周期策略对应用性能和资源管理的影响。
35.0万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

1. 配置不同生命周期在.NET Core内置依赖注入框架中的方法

  • 单例(Singleton): 单例模式确保整个应用程序生命周期内只有一个实例。在Startup.csConfigureServices方法中使用AddSingleton方法配置。例如:
services.AddSingleton<IMyService, MyService>();

这里IMyService是接口,MyService是实现类。当应用程序首次请求IMyService类型的服务时,框架会创建MyService的一个实例,并在后续请求中复用该实例。

  • 瞬时(Transient): 瞬时模式每次请求服务时都会创建一个新的实例。使用AddTransient方法配置。例如:
services.AddTransient<IMyService, MyService>();

每次从容器中解析IMyService时,都会得到一个全新的MyService实例。

  • 作用域(Scoped): 作用域模式确保在一个请求(或自定义作用域)内只有一个实例。使用AddScoped方法配置。例如:
services.AddScoped<IMyService, MyService>();

在Web应用中,一个HTTP请求通常对应一个作用域,在该请求处理过程中,无论何处请求IMyService,都会得到同一个MyService实例。如果是在自定义作用域内,在该自定义作用域生命周期内,服务实例也是唯一的。

2. 不同生命周期策略对应用性能和资源管理的影响

  • 单例(Singleton)

    • 性能影响:由于只有一个实例,对于频繁使用且开销较大的服务,可减少创建实例的开销,提高性能。例如数据库连接工厂,如果是单例,只需要创建一次数据库连接相关的资源,后续复用即可,避免了重复创建连接的开销。
    • 资源管理影响:单例实例在应用程序整个生命周期存在,可能会占用较多资源。如果单例服务持有大量内存资源或非托管资源,且这些资源在应用运行过程中不需要一直存在,可能导致资源浪费。例如单例的缓存服务,如果缓存数据不断增长,可能会占用过多内存。
  • 瞬时(Transient)

    • 性能影响:每次创建新实例会带来额外的性能开销,尤其对于创建成本较高的对象。例如创建一个复杂的对象,需要进行大量初始化操作,每次请求都创建新实例会降低性能。
    • 资源管理影响:瞬时实例在使用后很快会被垃圾回收,不会长期占用资源。适合轻量级、无状态的服务,这些服务不需要共享状态,每次创建新实例不会带来资源浪费。
  • 作用域(Scoped)

    • 性能影响:在一个作用域内复用实例,减少了实例创建开销,性能介于单例和瞬时之间。在Web应用的HTTP请求场景下,可避免在一个请求内多次创建相同服务实例的开销。
    • 资源管理影响:在作用域结束后,实例可被垃圾回收,不会长期占用资源。既保证了一定的资源复用,又不会像单例那样长期占用资源,适用于有一定状态且在请求内需要共享状态的服务。