我正在尝试了解 IoC w。依赖注入(inject),我关注了 Joel Abrahamsson 的这篇博文:http://joelabrahamsson.com/entry/inversion-of-control-introduction-with-examples-in-dotnet
我已经这样设置了我的项目:
- 型号
- 接口(interface)
- Controller
- Darwin
我的类(class)如下:
汽车
public class Car
{
public int Id { get; set; }
public string Brand { get; set; }
public string Year { get; set; }
}
汽车 Controller
public class CarController
{
private readonly ICar _carInterface;
public CarController(ICar car)
{
_carInterface = car;
}
public void SaveCar(Car car)
{
_carInterface.SaveCar(car);
}
}
ICar界面
public interface ICar
{
void SaveCar(Car car);
}
DbCar
public class DbCar: ICar
{
public void SaveCar(Car car)
{
throw new NotImplementedException();
}
}
现在,在 UI 上,我不知道该怎么处理;-) 我确实可以制作我需要的 Car 对象,但是当新建 CarController 时,它(当然)需要一个ICar接口(interface)我给不了。
我有一种感觉,在阅读乔尔斯(伟大的)文章的过程中,我误解了一些东西:-),我希望也许有人可以阐明我错过/误解的内容。
非常感谢任何帮助/提示!
提前非常感谢。
祝一切顺利,
博
最佳答案
看起来ICar
不是汽车的接口(interface)。相反,它是一个用于保存汽车的存储库的接口(interface)。因此它应该被称为 ICarRepository
(或者可能是 IGarage
。)
你说:
为什么不呢?您有一个实现,but when new'ing up a CarController, it (of course) expects an ICar interface which I can't give it.
DbCar
。为什么你不能给它其中之一?
您在评论中询问了此表达式:
new CarController(new DbCar())
具体来说,通过编写该行代码,您已将 Controller 绑定(bind)到汽车存储库的特定实现。
确实如此,但仅限于这种情况。在单元测试的其他地方你可以编写:
new CarController(new FakeCarRepository())
CarController
类是一个独立的模块,从其构造函数的参数列表中可以清楚地看出它对其他事物的依赖。
IoC 或“依赖注入(inject)”框架是提供标准方法来构造 CarController 等类的库,以便在配置文件中指定所需的参数。但这对于一个简单的应用程序来说可能有点过分了。
关于c# - 理解 IoC 与依赖注入(inject)时遇到的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12478217/