前谈依赖注入(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 的核心功能.


<<:  D12 - 彭彭的课程# Python 函式基础:定义并呼叫函式(1)

>>:  【Day27】this - 简易呼叫(Simple Call)

Day 20:1566. Detect Pattern of Length M Repeated K or More Times

今日题目 题目连结:1566. Detect Pattern of Length M Repeate...

[Day9] 预设贴图

今日目标 补充[Day4]第一个矩形的内容 产生预设贴图 设计简单的2D渲染器 iron_rende...

Day 05: Anaconda虚拟环境建置 Conda

在撰写Python专案时,时常会遇到需要不同Python版本以及不同版本的Package的问题。建立...

【day14】 Fab X 跳页Animation

好的! 我们今天主要要来设定Fab,以及跳页的动画! 1.先在我们的DashboardFragme...

[机派X] Day 6 - Linux 没网路,我要怎麽发铁人赛的文章

引言 今天是机派X系列文章的第六天。 昨天介绍了 Linux 的权限管理机制以及一些相关指令,今天要...