面试题答案
一键面试1. 配置不同生命周期在.NET Core内置依赖注入框架中的方法
- 单例(Singleton):
单例模式确保整个应用程序生命周期内只有一个实例。在
Startup.cs
的ConfigureServices
方法中使用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请求场景下,可避免在一个请求内多次创建相同服务实例的开销。
- 资源管理影响:在作用域结束后,实例可被垃圾回收,不会长期占用资源。既保证了一定的资源复用,又不会像单例那样长期占用资源,适用于有一定状态且在请求内需要共享状态的服务。