iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
自我挑戰組

C# 與 .Net Core 雜記系列 第 13

前談依賴注入(Dependency Injection)

直覺的物件導向程式

Car 類與 Engine 類的組合, Car 執行 run 前先產生 Engine, 讓 Engine 執行 start

// Car 必須要有 Engine 才能發動
class Car 
{
  public Car
  
  public void run()
  {
    Engine engine = new Engine();
    engine.start();
    Console.WriteLine("車子可以加速了");
  }
}

class Engine
{
  public void start()
  {
    Console.WriteLine("引擎發動");
  }
}
// 好像沒問題, 但很明顯耦合太高, 如果Egine 一變那麼 Car 也要跟著變
Car newCar = new Car();
newCar.run();

簡單的依賴注入

不要在 Car 裡面產生 Engine, 將 Engine 生產完後, 經由 Car 的建構函式把 Engine 注入進去

class Car 
{
  private Engine _engine;
  
  public Car(Engine engine)
  {
    _engine = engine;  // Engine 注入方式, 這裡是建構化注入
  }
  
  public void run()
  {
    engine.start();
    Console.WriteLine("車子可以加速了");
  }
}

class Engine
{
  private string _title;
  
  public Engine(string title)
  {
    _title = title;
  }
  
  public void start()
  {
    Console.WriteLine($"{title} 引擎發動");
  }
}
// 這樣一來, Egine 不管怎麼變, Car 沒必要變更
Engine vEngine = new Engine("V-Engine");
Car newCar1 = new Car(vEngine);
// 以上兩行可以改寫成一行
Car newCar2 = new Car(new Engine("W-Engine")); // 這樣一來更有依賴注入的感覺
newCar1.run();
newCar2.run();

Dependency Injection Container

如上段所述, 我們自己進行手動建構化注入, 也是不好管理, 這時 DI Container(Dependency Injection Container) 就出現了, 利用 DI Container 集中註冊方式, 來幫我們管理所有 DI 物件的注入規則, .NET 世界有內建的 DI Container, 這也是 ASP.NET Core 的核心功能.


上一篇
Entity Framework Core
下一篇
.NET、託管代碼(managed code)、反射
系列文
C# 與 .Net Core 雜記14

尚未有邦友留言

立即登入留言