2

我正在努力了解 IoC w。依赖注入,我关注了 Joel Abrahamsson 的这篇博文:http: //joelabrahamsson.com/entry/inversion-of-control-introduction-with-examples-in-dotnet

我已经这样设置了我的项目:

  • 模型
  • 接口
  • 控制器
  • 达尔

我的课程如下:

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();
    }
}

现在,在 UI 上,我不确定如何处理这个 ;-) 我可以肯定地制作我需要的 Car 对象,但是当新建 CarController 时,它(当然)需要一个 ICar 接口我给不了。

我有一种感觉,我在阅读 Joels(伟大的)文章的过程中误解了一些东西 :-) 我希望也许有人可以阐明我错过/误解的内容。

非常感谢任何帮助/提示!

提前非常感谢。

一切顺利,

4

2 回答 2

2

它看起来ICar不是汽车的接口。相反,它是用于保存汽车的存储库的接口。因此应该调用它ICarRepository(或可能IGarage。)

你说:

但是当新建一个 CarController 时,它(当然)需要一个我不能给它的 ICar 接口。

为什么不?你有一个实现,DbCar. 为什么你不能给它其中之一?

你在评论中询问了这个表达式:

new CarController(new DbCar())

具体来说,通过编写该行代码,您已将控制器绑定到汽车存储库的特定实现。

这是真的,但仅限于这种情况。在单元测试的其他地方你可以写:

new CarController(new FakeCarRepository())

该类CarController是一个独立的模块,它对其他事物的依赖从其构造函数的参数列表中可以清楚地看出。

IoC 或“依赖注入”框架是提供标准方法来构造类的库,例如CarController,它需要的参数将在配置文件中指定。但这对于一个简单的应用程序来说可能有点过头了。

于 2012-09-18T13:43:55.687 回答
0

要正确地进行依赖注入和控制反转,您应该坚持基于接口的开发(SOLID原则中的“I”)。下面是我如何组织你的类和接口,以便能够最大限度地实现这一点。

ICar接口

public interface ICar
{
    int Id { get; set; }
    string Brand { get; set; }
    string Year { get; set; }
}

public class Car : ICar
{
    public int Id { get; set; }
    public string Brand { get; set; }
    public string Year { get; set; }
}

ICarRepository 接口

public interface ICarRepository
{
    void SaveCar(ICar car);
}

汽车存储库

public class CarRepository : ICarRepository
{
    public void SaveCar(ICar car)
    {
        throw new NotImplementedException();
    }
}

ICarController 接口

public interface ICarController
{
     void SaveCar(ICar car);
}

汽车控制器

public class CarController : ICarController
{
     private readonly ICarRepository _carRepository;

     public CarController(ICarRepository carRepository)
     {
         _carRepository = carRepository;
     }

     public void SaveCar(ICar car)
     {
          _carRepository.SaveCar(car);
     }
}

那么你也能:

ICarRepository carRepository = new CarRepository();
ICarController carController = new CarController(carRepository);
ICar carOne = new Car { Id = 1, Brand = "Ford", Year = "2010" };
ICar carTwo = new Car { Id = 2, Brand = "Dodge", Year = "1999" };

carController.SaveCar(carOne);
carController.SaveCar(carTwo);
于 2012-09-18T14:03:40.913 回答