我正在努力使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之类的类的库,因此所需的参数将在配置文件中指定。但这对于一个简单的应用程序可能是过大了。

07-28 00:47