如何在程序中正确表达构图?

问题描述 投票:0回答:3

假设我们有2类:汽车和发动机。引擎取决于汽车-汽车毁坏时,引擎也取决于汽车。如何正确表达恩金对汽车的依赖?关系是Engine类在Car之外没有意义。我认为,注入Engine表示与Car有一定的独立性。在这种情况下,哪个汽车制造商是正确的?有无DI?

示例代码:

interface IEngine { }

class Engine : IEngine { }

class Car
{
    private readonly IEngine _engine;

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

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

}
c# dependency-injection composition
3个回答
0
投票

两个想法:

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

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


0
投票

您可以使用嵌套的类:

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?


0
投票

与DI一起使用。

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

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

例如您可以使用带有虚拟引擎的展示模型车。或用于您的超现代发动机的测试设施。

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

© www.soinside.com 2019 - 2024. All rights reserved.