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 的核心功能.
<<: D12 - 彭彭的课程# Python 函式基础:定义并呼叫函式(1)
>>: 【Day27】this - 简易呼叫(Simple Call)
今日题目 题目连结:1566. Detect Pattern of Length M Repeate...
今日目标 补充[Day4]第一个矩形的内容 产生预设贴图 设计简单的2D渲染器 iron_rende...
在撰写Python专案时,时常会遇到需要不同Python版本以及不同版本的Package的问题。建立...
好的! 我们今天主要要来设定Fab,以及跳页的动画! 1.先在我们的DashboardFragme...
引言 今天是机派X系列文章的第六天。 昨天介绍了 Linux 的权限管理机制以及一些相关指令,今天要...