前言
今天也到了這系列的 1/3 天數的分享課程了,也剛好要進入較為重要之二的重點, DI 注入,個人認為它是 ASP .NET Core 中核心重點之一的設計模式,了解此觀念,會比只會用 ASP .NET Core 寫專案或是看專案內大家都這麼用,然後去使用,卻不清楚到底為何要用此種設計模式來的好!
前些年剛接觸 DI 時候(因為那時候專案又碰到 interface介面),我真的超級痛苦,因為它馬的超級抽象,而且通常抽象的知識,聽不到一半就會想睡覺甚至放棄學習它,然後那時我完全不懂為何要使用它XDD
所以我會盡量以白話一點方式去解說以及舉例程式碼,真心希望幫助到還有疑惑的大家!
分享主軸
白話點,依賴注入(Dependency Injection, DI)是一種設計模式。它主要用於解決對象之間的依賴關係,降低代碼的耦合度,提升可維護性和可測試性。
三個重點 :
補充 : 可能上網查會常看到 DI 達成控制反轉(IoC)的技術 (這邊不太多說明),總之白話一點就是,IoC 即一種概念,主要作用就是降低類別間的依賴,而這功用也就是上面講到的 : DI 可以做到的事情
依賴注入 ( DI ) 是一種設計模式,ASP.NET Core 中的依賴注入實現方式包括使用介面和抽象類別、使用服務容器和使用建構函式注入等方法
分三種 : ( 注入可以想成把實作類別 new 出一個實例 )
builder.Services.AddScoped<要注入的服務>();
builder.Services.AddSingleton<要注入的服務>();
builder.Services.AddTransient<要注入的服務>();
舉一個超簡單範例,有一個 汽車類別 與 引擎類別(汽車所需要的零件),需求是做出一台汽車可以啟動,如下範例 :
//汽車
public class Car
{
private Engine _engine;
public Car()
{
_engine = new Engine();
}
public void Drive()
{
_engine.Start();
Console.WriteLine("Car is driving.");
}
}
//引擎1
public class Engine
{
public void Start()
{
Console.WriteLine("Engine started.");
}
}
//用到它 :
Car car = new Car();
car.Drive();
得出結果為
若今天要替換成引擎2,那等於上面 Car 類別內程式要調整,如下
//引擎2
public class AdvancedEngine
{
public void Start()
{
Console.WriteLine("Advanced Engine started.");
}
}
//汽車類別也得調整
public class Car
{
private AdvancedEngine _engine;
public Car()
{
_engine = new AdvancedEngine(); // 替換為新的實作
}
public void Drive()
{
_engine.Start();
Console.WriteLine("Car is driving.");
}
}
遇到的問題困擾
這邊使用介面去定義汽車需要用到的動作 : 啟動 方法
//定義引擎介面
public interface IEngine
{
void Start();
}
//汽車類別
public class Car
{
private readonly IEngine _engine;
public Car(IEngine engine) //使用建構式注入方式
{
_engine = engine;
}
public void Drive()
{
_engine.Start();
Console.WriteLine("Car is driving.");
}
}
//引擎類別1
public class Engine : IEngine
{
public void Start()
{
Console.WriteLine("Engine started.");
}
}
//引擎類別2
public
class AdvancedEngine : IEngine
{
public void Start()
{
Console.WriteLine("Advanced Engine started.");
}
}
//在 program.cs內註冊服務
builder.services.AddScoped<IEngine, Engine>();
builder.Services.AddScoped<Car>();
使用引擎1,結果如下圖一
若今天要替換引擎2,此時只需要在註冊的地方更改程式,把需要用到的引擎實作註入進去介面即可,Car 類別完全不需要調整
builder.services.AddScoped<IEngine, AdvancedEngine>();
簡單統整今日重點
今日結語
透過今日分享,相信可以大大理解 DI 生命週期到底是什麼以及與以往 new 差異,也更可以知道 ASP .NET Core 內建的這樣東西到底為什麼那麼好用? 為什麼需要用到它? 下次面試,也回答得出來,也真的讓自己理解。
真心希望有幫助到還有疑惑的人,明日繼續努力,謝謝。