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