假设我们有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;
}
}
两个想法:
体系结构可能会受到可测试性的影响。注入使测试类变得更加容易,因为可以注入模拟或存根。
在假设关系过于严格时要小心:发动机当然可以独立于汽车而存在,例如:在工厂,修理厂和回收中。与轮胎等类似。(这就是为什么我不像Olivier所建议的那样将其设计为内部类。)
您可以使用嵌套的类:
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?
与DI一起使用。
至于类比;如果您的汽车负责制造发动机;在某个时候很难更换引擎。即使您不更改实际类型(例如,将天然气转换为电),更改构造函数也会给您带来一些问题。
当然,汽车不依赖于发动机,反之亦然,具体类型是。
例如您可以使用带有虚拟引擎的展示模型车。或用于您的超现代发动机的测试设施。
因此,如果可能的话:不要做新的事情(尤其是在使用接口时),而要使用DI。特别;当您处理实际硬件时;-)