在 DI 模式的上下文中,“绑定”是什么意思?

What does the `binding` mean in the context of the DI pattern?

在 DI 模式的上下文中 binding 是什么意思?

我将在 here 上完成 IoC 教程。我看到了以下摘录:

Dependency Injection (DI) is a design pattern used to implement IoC. It allows the creation of dependent objects outside of a class and provides those objects to a class through different ways. Using DI, we move the creation and binding of the dependent objects outside of the class that depends on them.

我不明白这里指的绑定是什么?

我猜这里提到的绑定是关于设置客户端class字段的。但在这种情况下,我们不会移动与 DI 的绑定。因为,DI的使用方式有三种:构造函数、属性(setter)和方法。并且所有这些方式都不会将绑定(客户端 class 字段的赋值)移动到 class 之外,它们都发生在客户端 class 的范围内。所以,我在这里很困惑。

更新 在对问题提供了一些答案后,我得出结论,binding 有两种可能的定义。

1 绑定意味着将在依赖 class 中使用的接口映射到实际对象类型。

2 绑定意味着将实际类型作为接口参数的实参传递到相关的 classes.

12 的正确定义是什么?还是 binding 的定义取决于提到 binding 的上下文?

可以让 class 不知道注入其中的实际 classes。

它可以依赖接口,而不是 classes,其中 class 实例化的逻辑,以便 "fulfill" 每个接口都可以委托给外部代码classes 本身(或配置)。

所以我们可以说在需要接口的地方注入 class 的操作就像 "binding"。

What binding means?

表示我们的依赖classes会自动被IoC容器解析

例如:

我们有 IRepository interfaceRepository class

如果我们将这两者绑定在一起。每次我们请求 IRepository 时,我们的容器都会自动为我们提供 Repository class.

This makes it very easy to alter the implementation of the Repository class. Since we are not immediately dependent on it. We never say new Repository class. We only provide the interface and everything else is taken care of by the container. You could for example say the IRepository is bound to the DatabaseRepository class. With only changing your container bindings and nothing else.

这一切都是由于 IoC 容器中的绑定而发生的。这为您的应用程序内部提供了很大的灵活性。

此外,我们可以使用容器中的绑定命令为我们的对象提供生命周期,通常是这三个(Singleton、PerInstance、Scoped)。

你可以像那样编写没有依赖注入的代码:

class NoDiRadio
{
    public EnergizerBattery Battery { get; set; }

    public NoDiRadio()
    {
        Battery = new EnergizerBattery(); // creation and binding inside of NoDiRadio
    }
}

class EnergizerBattery
{
    public void Start()
    {
    }        
}

但是,您可以像这样编写更松散耦合的代码和更可测试的代码:

class DiRadio
{
    public IBattery Battery { get; set; }

    public DiRadio(IBattery battery)
    {
        Battery = battery;
    }
}

interface IBattery
{
    void Start();
}

class EnergizerBattery : IBattery
{
    public void Start()
    {
    }        
}

然后 我们将依赖对象的创建和绑定移到依赖它们的 class 之外

IBattery battery = new DuracellBattery(); // creation and **binding** to IBattery here
var diRadio = new DiRadio(battery);

更新:

在 IoC 容器中绑定意味着,当我们看到 IBattery 时,我们的 IoC 容器将解析 DuracellBattery 的实例并注入它。这是 Ninject Bind 方法的示例:

Bind<IBattery>().To<DuracellBattery>()