c# - 理解 IoC 与依赖注入(inject)时遇到的问题

标签 c# interface dependency-injection inversion-of-control

我正在尝试了解 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/

相关文章:

java - 如何使用 object.Clone 冲突方法实现接口(interface)

c# - GCFrame 中的高线程数导致 CPU 使用率高

C# Entity Framework : TransactionScope over two different databases on same server with DTC

c# - 在 xml 注释中,我可以标记方法名称以便它们可重构吗?

c# - 在没有 ssl 证书的服务器上为新的 mvc3 站点启用 http

pointers - golang指针之间的区别

c# - 接口(interface)——有什么意义?

android - 如何使用 dagger.android @Inject 抽象 BaseActivity 及其子类?

java - 以 spring bean 作为属性的垃圾收集清理对象

c# - 值(value)提供者的惰性评估依赖注入(inject)(Unity,结构图,Ninject ...)