ASP.NET Core面试精讲系列二_asp.net core教学视频
haoteby 2025-10-02 19:12 19 浏览
dotNET跨平台2025-09-28 08:01:58
16. 什么是依赖注入?为什么要使用?
-
定义
依赖注入(Dependency Injection, DI)是一种设计模式:将依赖项(服务/对象)通过外部传递(注入)给类,而不是在类内部直接创建。
-
优点
- 促进 松耦合(类不再依赖具体实现,而是依赖接口/抽象)
- 提高 可测试性(可以方便替换依赖,例如单元测试中的 Mock)
- 实现 关注点分离(业务逻辑与对象创建解耦)
17. ASP.NET Core 内置 DI 容器:能力与局限
-
能力
-
构造函数注入(官方推荐)
-
生命周期管理:瞬态 (Transient)、作用域 (Scoped)、单例 (Singleton)
- 支持
IEnumerable
注入 - 支持开放泛型(如
IRepository
) - 可通过
IServiceProvider
手动解析 -
局限
- 不支持 命名注册(无法根据名称区分不同实现)
- 属性注入支持有限(需手工扩展或第三方容器)
- 功能相对基础,不如 Autofac、StructureMap等第三方容器强大
18. 不同服务生命周期:瞬态、作用域、单例
生命周期 | 描述 | 使用场景示例 |
---|---|---|
瞬态 | 每次解析都会创建新实例 | 轻量级、无状态服务 |
作用域 | 每个请求/作用域内一个实例 | 数据库上下文、工作单元 |
单例 | 应用程序整个生命周期一个实例 | 配置、日志、缓存服务 |
19. 在 ConfigureServices 注册服务
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient
services.AddScoped
services.AddSingleton
}
20. 在控制器、Razor Pages、中间件中解析依赖
- 控制器:构造函数注入(推荐)
- Razor Pages:在 PageModel 构造函数注入
- 中间件:
-
构造函数注入(推荐)
- 或通过
IApplicationBuilder.ApplicationServices
手动解析(不推荐,除非特殊场景)
21. 构造函数注入 vs 属性注入
-
构造函数注入
-
ASP.NET Core 原生支持
-
推荐方式,保证依赖不可变、清晰
-
属性注入
结论:推荐构造函数注入
22. 使用 IServiceProvider / IServiceScopeFactory
-
IServiceProvider
:手动解析服务(一般少用) -
IServiceScopeFactory
:创建新的作用域,常用于后台任务
示例:
using (var scope = serviceScopeFactory.CreateScope)
{
var scopedService = scope.ServiceProvider.GetRequiredService
}
23. 作用域服务在后台任务中的行为
-
默认情况:作用域服务与 HTTP 请求生命周期绑定
-
后台任务:没有请求上下文,不能直接注入 Scoped 服务
- 解决方法:通过
IServiceScopeFactory
手动创建作用域来解析 Scoped 服务
24. 覆盖默认 DI 行为(移除或替换服务)
services.AddSingleton
var descriptor = services.First(x => x.ServiceType == typeof(IMyService));
services.Remove(descriptor);
25. Options 模式(IOptions, IOptionsSnapshot, IOptionsMonitor)
-
IOptions
单例模式,读取应用启动时的配置快照。适用于单例服务。
-
IOptionsSnapshot
每次请求都会重新计算配置值。生命周期:Scoped(作用域)。适合 Web 应用中的多请求场景。
-
IOptionsMonitor
单例模式,可监听配置变化(回调通知)。适合后台服务、长生命周期组件。
注册示例:
services.Configure
26. IHostedService / BackgroundService 与 DI
-
IHostedService
ASP.NET Core 提供的后台任务接口
-
BackgroundService
IHostedService
的抽象基类,简化使用 -
DI 特点
可直接构造函数注入单例/瞬态服务
若需要 Scoped 服务,则必须用
IServiceScopeFactory
创建新作用域
27. 注入配置提供者(IConfiguration)
-
IConfiguration
已自动注册,可通过构造函数注入
示例:
public class MyService
{
private readonly IConfiguration _config;
public MyService(IConfiguration config)
{
var key = config["MyKey"];
}
}
28. 注入日志(ILogger)
示例:
public class MyService
{
private readonly ILogger
public MyService(ILogger
public void DoSomething
=> _logger.LogInformation("执行了操作");
}
29. 处理循环依赖
-
定义:当两个服务直接或间接依赖彼此时产生循环引用
-
常见解决方法:
-
重构以消除循环依赖
- 使用
Lazy
或工厂模式延迟创建 -
拆分服务职责,降低耦合
30. 在单元测试中模拟依赖
示例:
var mockService = new Mock
mockService.Setup(s => s.Get).Returns("test");
var controller = new MyController(mockService.Object);
优点:可隔离测试目标,验证逻辑,而不是依赖外部服务
相关推荐
- 如何为MySQL服务器和客户机启用SSL?
-
用户想要与MySQL服务器建立一条安全连接时,常常依赖VPN隧道或SSH隧道。不过,获得MySQL连接的另一个办法是,启用MySQL服务器上的SSL封装器(SSLwrapper)。这每一种方法各有其...
- k8s 证书问题排查_k8s dashboard 证书
-
从去年开始一些老项目上陆陆续续出现一些列的证书问题,(证书原理这里就不说了,官方文档一堆)多数刚开始的表现就是节点的kubelet服务起不来,节点状态NotReady表现日志如下failed...
- 企业级网络互通方案:云端OpenVPN+爱快路由器+Win11互联实战
-
企业级网络互通方案:OpenVPN搭建公有云+爱快路由器+Win11三地互联实战指南「安全高效」三地局域网秒变局域网实施环境说明...
- OpenV** Server/Client配置文件详解
-
Server配置详解...
- 接口基础认知:关键信息与合规前提
-
1.核心技术参数(必记)...
- S交换机通过SSH登录设备配置示例(RADIUS认证+本地认证独立)
-
说明:●本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。●通过不同的管理域来实现RADIUS认证与本地认证两种方式同时使用,两...
- SSL证书如何去除私钥密码保护_ssl证书怎么取消
-
有时候我们在生成证书的时候可以加入了密码保护。然后申请到证书安装到了web服务器。但是这样可能会带来麻烦。每次重启apache或者nginx的时候,都需要输入密码。那么SSL证书如何去除私钥密码保护。...
- SSL证书基础知识与自签名证书生成指南
-
一、证书文件类型解析...
- S交换机通过SSH登录设备配置示例(RADIUS认证)
-
说明:本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。假设已在RADIUS服务器上创建了用户名yc123,密码test#123。对...
- HTTPS是什么?加密原理和证书。SSL/TLS握手过程
-
秘钥的产生过程非对称加密...
- HTTPS TLS握手流程_进行tls握手
-
1.客户端向服务器发送`ClientHello`消息,包括支持的TLS版本、加密套件、随机数等信息。2.服务器收到`ClientHello`消息后,解析其中的信息,并根据配置选择一个加密套件。3....
- Spring Boot 单点登录(SSO)实现_spring boot 单点登录jwt
-
SpringBoot单点登录(SSO)实现全指南单点登录(SingleSign-On,SSO)是一种身份验证机制,允许用户使用一组凭证登录多个相关但独立的系统。在微服务架构和企业级系统中,SS...
- 源码分享:在pdf上加盖电子签章_pdf如何加盖电子公章
-
在pdf上加盖电子签章,并不是只是加个印章图片,。而是要使用一对密钥中的私钥对文件进行签字。为啥要用私钥呢?很简单,因为公钥是公开的,其他人才可以用公钥为你证明,这个文件是你签的。这就是我们常说的:私...
- 微信支付商户API证书到期 怎么更换
-
微信支付商户API证书到期更换是一个非常重要的操作,需要仔细按照流程进行。如果证书过期,所有通过API的支付、退款等操作都会失败,将直接影响您的业务。请按照以下详细步骤进行操作:重要前提:分清...