通俗理解依赖注入与控制反转

  1. 假设你是一个厨师,要做一道菜(比如番茄炒蛋)。你需要食材:番茄和鸡蛋.
    传统方式:你自己去市场买菜、挑选、清洗,然后开始做饭.
    依赖注入方式:有人(比如一个助手)提前帮你准备好食材,洗干净、切好,直接交给你,你只负责做饭.
    👉 你依赖的是食材,但你不负责创建它们,而是“注入”给你.

  2. 假设你每天吃饭有两种方式:
    自己做饭:你决定吃什么、买什么、怎么做,一切都由你控制.
    点外卖:你只告诉平台你想吃什么,平台安排餐厅、配送员、时间等细节.
    👉 控制反转就是从“自己控制一切”变成“把控制权交给别人”.

没有使用依赖注入
使用依赖注入
public class Car {
    // Car 自己控制 Engine 的创建
    // Car 自己创建 Engine
    private Engine engine = new Engine();
}
public class Car {
    private Engine engine;

    // Engine 从外部传入
    public Car(Engine engine) {
        this.engine = engine;
    }
}

C# 中依赖注入示例

引入依赖注入库
IBattery.cs
Batter.cs
Test2.xaml
Test2.xaml.cs
App.xaml.cs
namespace DependcyTest
{
    public interface  IBattery
    {
        string GetStatus();
    }
}
namespace DependcyTest
{
    public class Nanfu : IBattery
    {
        private string price { get; set; }
        public Nanfu()
        {
            price = "10块";
        }
        public string GetStatus()
        {
            return "南孚充电中"+"...充电完成收费"+$"{price}";
        }
    }
}
<Window x:Class="DependcyTest.Test2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DependcyTest"
        mc:Ignorable="d"
        Title="Test2" Height="450" Width="800">
    <Grid>
        <Button Content="查看" Height="32" Width="60" Click="Button_Click"/>
    </Grid>
</Window>
using System.Windows;

namespace DependcyTest
{
    public partial class Test2 : Window
    {
        private IBattery _battery;
        public Test2(IBattery battery)
        {
            InitializeComponent();
            _battery = battery;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(_battery.GetStatus());
        }
    }
}
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Windows;

namespace DependcyTest
{
    public partial class App : Application
    {
        private IServiceProvider _serviceProvider;
        protected override void OnStartup(StartupEventArgs e)
        {
            // 配置依赖注入容器
            var serviceCollection = new ServiceCollection();

            // 注册电池接口的实现
            serviceCollection.AddSingleton<Nanfu>();
            serviceCollection.AddSingleton<IBattery, Nanfu>();
            _serviceProvider = serviceCollection.BuildServiceProvider();

            // 构建服务提供者
            var nanfu = _serviceProvider.GetService<Nanfu>();

            // 创建主窗口并注入依赖项
            var mainWindow = new Test2(nanfu);
            mainWindow.Show();
        }
    }
}

java 中依赖注入示例