依赖注入与控制反转
通俗理解依赖注入与控制反转
-
假设你是一个厨师,要做一道菜(比如番茄炒蛋)。你需要食材:番茄和鸡蛋.
传统方式:你自己去市场买菜、挑选、清洗,然后开始做饭.
依赖注入方式:有人(比如一个助手)提前帮你准备好食材,洗干净、切好,直接交给你,你只负责做饭.
👉 你依赖的是食材,但你不负责创建它们,而是“注入”给你. -
假设你每天吃饭有两种方式:
自己做饭:你决定吃什么、买什么、怎么做,一切都由你控制.
点外卖:你只告诉平台你想吃什么,平台安排餐厅、配送员、时间等细节.
👉 控制反转就是从“自己控制一切”变成“把控制权交给别人”.
没有使用依赖注入
使用依赖注入
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();
}
}
}