gpt4 book ai didi

c# - C# 中的依赖注入(inject)

转载 作者:行者123 更新时间:2023-11-30 14:31:33 27 4
gpt4 key购买 nike

我正在从这个来源学习构造函数注入(inject) https://softwareengineering.stackexchange.com/questions/177649/what-is-constructor-injection

我很高兴我能够理解它。但是,我对接口(interface)和类以及在构造函数中注入(inject)接口(interface)有一个基本的疑问。

具体来说,我无法理解我们如何在不创建第一个片段中的 Sword 对象的情况下注入(inject)接口(interface)。

class Samurai
{
readonly IWeapon weapon;
public Samurai()
{
this.weapon = new Sword();
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}

在下面的代码片段中,他们声称它与上面的代码做同样的事情,但是,耦合松散。

class Samurai
{
readonly IWeapon weapon;
public Samurai(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}

谁能帮我理解为什么我们不在第二个代码段中使用 “new” 关键字创建 Sword 对象,如果没有它它是如何工作的?以上两个片段是否相同?而且,这怎么会失去耦合?

最佳答案

通过传递 IWeapon 的实现,您可以根据需要使用您决定创建的任何对象拥有任意数量的武器版本,只要它共享相同的公共(public)接口(interface)即可。

您可以创建一个使用 IWeapon 接口(interface)的 Gun 或 Sword 对象,而您的 Samurai 类不会在意。在类中使用 new 关键字会阻止您这样做。相反,您被迫只使用 Samurai 知道的单一实现(因为它创建了它)。因此,如果您以后想添加另一种武器,则必须修改 Samurai 类。如果您将 Samurai 作为 API 公开给其他开发人员,那么以这种方式实现 Samurai 尤其令人厌恶,因为他们不想在您的代码中乱搞。

所以你会做这样的事情:

Gun gun = new Gun();
Samurai samurai = new Samurai(gun);

实现看起来像这样:

public class Gun : IWeapon { // Implementing IWeapon, and typecasting the class into a Weapon
public Attack(string target) {
// Perform attack logic here
}
}

你的界面看起来像这样:

public interface IWeapon {
void Attack(string target);
}

关于c# - C# 中的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19872500/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com