C#学习记录:依赖注入(DI)的通俗解释
想象你在开一家咖啡店,依赖注入就像是一种高效的"咖啡原料供应系统"。
最原始的方式:自己动手
❌ 没有DI的情况:
每次做咖啡时,你自己去仓库拿咖啡豆
自己磨豆子
自己煮开水
自己倒牛奶
// 相当于代码中的
public class CoffeeMaker {
public void MakeCoffee() {
var beans = new CoffeeBeans(); // 自己找豆子
var grinder = new Grinder(); // 自己拿研磨机
var water = new WaterHeater(); // 自己烧水
// …制作过程…
}
}
使用依赖注入后:专业分工
✅ 有DI的情况:
你只需要专注于"制作咖啡"这个核心工作
所有原料和工具都会自动送到你手边
今天用A品牌的牛奶,明天换B品牌,你完全不需要改变工作方式
// 相当于代码中的
public class CoffeeMaker {
private readonly ICoffeeBeans _beans;
private readonly IGrinder _grinder;
private readonly IWaterHeater _water;
// 所有需要的工具和原料都通过"构造函数"送进来
public CoffeeMaker(ICoffeeBeans beans, IGrinder grinder, IWaterHeater water) {
_beans = beans;
_grinder = grinder;
_water = water;
}
public void MakeCoffee() {
// 直接使用已经提供的工具和原料
// ...制作过程...
}
}
DI容器的角色:智能管家
在ASP.NET Core中,builder.Services就是这个"智能管家":
登记服务(告诉管家有什么):
csharp
复制
// 登记:"当有人要ICoffeeBeans时,给他ArabicaBeans"
builder.Services.AddScoped<ICoffeeBeans, ArabicaBeans>();
自动配送(管家负责送货):
csharp
复制
// 当创建CoffeeMaker时,管家会自动:
// 1. 准备ArabicaBeans实例
// 2. 准备Grinder实例
// 3. 准备WaterHeater实例
// 4. 把这些传给CoffeeMaker构造函数
var maker = serviceProvider.GetService<CoffeeMaker>();
为什么这样更好?
更换原料超容易:想换咖啡豆品牌?只需改一处注册代码
测试更方便:可以用"假豆子"做测试
各司其职:咖啡师只管做咖啡,不用关心原料从哪来
灵活组合:早晨用浓咖啡豆,下午换低因咖啡豆,咖啡师的工作方式完全不变
就像专业的咖啡店有专人负责供应链一样,DI让我们的代码也有了专业分工! ☕️