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

假设我们有 2 个类:Car 和 Engine。发动机取决于汽车——当汽车被毁坏时,发动机也随之被毁。如何正确表达Engin对Car的依赖?其关系是 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;

    }


}


POPMUISE
浏览 52回答 3
3回答

慕雪6442864

两个想法:架构可能会受到可测试性的影响。注入使得测试类变得更加容易,因为可以注入模拟或存根。假设过于严格的关系时要小心:发动机当然可以独立于汽车而存在,例如在工厂、修理店和回收中。轮胎等类似。(这就是为什么我不会像奥利维尔建议的那样将其设计为内部类。)

扬帆大鱼

使用带有 DI 的那个。至于类比;您的汽车是否负责制造发动机;在某些时候很难改变引擎。即使您不更改实际类型(例如,将天然气更改为电力),更改构造函数也会给您带来一些问题。当然,汽车并不取决于发动机,反之亦然,具体的类型也是如此。例如; 您可以拥有一辆带有虚拟发动机的展示模型车。或者超现代发动机的测试设施。因此,如果可能的话:不要做 new(尤其是在使用接口时),而是使用 DI。尤其; 当您处理实际硬件时;-)

收到一只叮咚

您可以使用嵌套类: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;  }}
打开App,查看更多内容
随时随地看视频慕课网APP