我正在努力使IoC w。依赖注入,我关注了Joel Abrahamsson的这篇博文:http://joelabrahamsson.com/entry/inversion-of-control-introduction-with-examples-in-dotnet
我已经建立了这样的项目:
模型
介面
控制器
DAL
我的课程如下:
汽车
public class Car
{
public int Id { get; set; }
public string Brand { get; set; }
public string Year { get; set; }
}
汽车控制器
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);
}
汽车
public class DbCar: ICar
{
public void SaveCar(Car car)
{
throw new NotImplementedException();
}
}
现在,在用户界面上,我不确定该怎么做;-)我可以确定是否足够使我所需的Car对象,但是在新安装CarController时,它(当然)需要一个ICar接口我不能给
我有一种感觉,就是在阅读Joels(出色的)文章的过程中误解了一些东西:-)我希望也许有人可以阐明我错过/误解的地方。
任何帮助/提示,我们将不胜感激!
非常感谢。
祝一切顺利,
博
最佳答案
看来ICar
不是汽车的接口。相反,它是用于保存汽车的存储库的接口。因此,应将其称为ICarRepository
(或可能为IGarage
)。
你说:
但是当刚开始使用CarController时,(当然)它会期望一个ICar
界面,我不能给它。
为什么不?您有一个实现,DbCar
。您为什么不能给其中之一?
您在关于此表达式的评论中询问:
new CarController(new DbCar())
具体而言,通过编写该行代码,您已将控制器绑定到了汽车存储库的特定实现。
没错,但仅在这种情况下。您可以在单元测试中的其他地方编写:
new CarController(new FakeCarRepository())
CarController
类是一个独立的模块,可以从其构造函数的参数列表中清楚了解其对其他事物的依赖性。IoC或“依赖项注入”框架是提供标准方法来构造诸如
CarController
之类的类的库,因此所需的参数将在配置文件中指定。但这对于一个简单的应用程序可能是过大了。