如何在程序中正确表达作文?

How to express the composition correctly in program?

假设我们有 2 个 classes:Car 和 Engine。引擎取决于汽车——当汽车被摧毁时,引擎也取决于汽车。如何正确表达Engin对Car的依赖?关系是Engineclass在Car之外没有意义。在我看来,Engine 的注入表明在某种程度上独立于 Car。在这种情况下,哪个 Car 构造函数是正确的?有或没有 DI?

示例代码:

interface IEngine { }

class Engine : IEngine { }

class Car
{
    private readonly IEngine _engine;

    public Car()
    {
        _engine = new Engine();
    }

    public Car(IEngine engine)
    {
        _engine = engine;
    }

}

您可以使用嵌套 class:

public interface IEngine
{
  void SomeMethod();
}

public class Car
{

  private class DefaultEngine : IEngine
  {
    void IEngine.SomeMethod()
    {
      throw new NotImplementedException();
    }
  }

  private readonly IEngine _engine;

  public Car()
  {
    _engine = new DefaultEngine ();
  }

  public Car(IEngine engine)
  {
    _engine = engine;
  }

}

这里有一些解释:

Nested Types (C# Programming Guide)

Why/when should you use nested classes in .net? Or shouldn't you?

两个想法:

  1. 架构可能会受到可测试性的影响。注入使得测试 class 变得更容易,因为可以注入模拟或存根。

  2. 假设过于严格的关系时要小心:引擎当然可以独立于汽车而存在,例如在工厂、维修店和回收中。轮胎等类似(这就是为什么我不会像 Olivier 建议的那样将其设计为内部 class。)

使用带 DI 的那个。

至于类比;如果您的汽车负责制造发动机;在某些时候很难更换引擎。即使您不更改实际类型(例如,从燃气到电动),更改构造函数也会给您带来一些问题。

当然汽车不依赖于发动机,反之亦然,嗯,具体的类型就是。

例如; 您可以拥有一辆带有假引擎的展示模型车。或用于超现代引擎的测试设施。

所以,如果可能的话:不要做新的(尤其是在使用接口时),而是使用 DI。尤其;当您处理实际硬件时 ;-)