依赖注入 DI

依赖注入的作用就是: 你的代码不再自己创建对象,而是坐等别人把需要的工具送过来。

使用依赖注入的优点
想换就换(解耦): 今天你想用铁锅,明天想换不粘锅,大厨不需要改代码,只要在传送带后台把“锅”的型号改一下就行。

方便测试: 你想测试大厨技术好不好,可以送给他“假肉”去试,不用真的去杀猪。

省资源: 有些工具(比如数据库连接)全餐厅共用一套就行,传送带可以保证大家拿到的都是同一个,不用人人买一套。
————————————————————————————————————————————————————————————————————————

DI 里的三个“工具寿命” (Service Lifetime)
这是面试和实战中最关键的。传送带送东西有三种规矩:

单例 (Singleton) —— “公用大电视”
全餐厅就这一台,从开业到倒闭,所有人拿到的都是同一个。

范围 (Scoped) —— “一桌一份的菜单”
在这一单生意(一个请求)里,不管你喊几次,送来的都是同一张单子。单子办完,这单生意结束,菜单就扔了。

瞬时 (Transient) —— “一次性筷子”
你每喊一次,传送带就给你送一双新的,用完即弃。

——————————————————————————————————————————————————————————————————————
造工具(定义接口和类)
先定义一个“洗碗服务”
public interface IWashService { void Wash(); } // 规矩:会洗碗就行
public class FastWash : IWashService { ... } // 具体的干活人
————————————————————————————————————————————————————————————————————————————————————

登记到传送带(在 Program.cs 注册)
你要告诉餐厅系统,有人要“洗碗”的时候,派谁去。

var builder = WebApplication.CreateBuilder(args);

// 登记:有人要 IWashService 时,送他一个 FastWash

————————————————————————————————————————————————————————————————————————————————————————

大厨伸手要(在控制器构造函数里接收)
大厨(控制器)不需要自己 new FastWash(),直接在门口等着接。

public class OrderController : ControllerBase
{
private readonly IWashService _washService;

// 大厨说:我要洗碗服务,传送带会自动塞进来
public OrderController(IWashService washService)
{
_washService = washService;
}
}
builder.Services.AddScoped<IWashService, FastWash>();

——————————————————————————————————————————————————————————————————————————————————————————————

依赖 = 大厨干活需要的工具(比如数据库、发邮件的插件)。

注入 = 送货上门的动作。

DI 容器 = 那个负责管账、送货的智能传送带

posted @ 2026-04-17 23:08  菜鸟的奋斗军  阅读(11)  评论(0)    收藏  举报