简单C#中的DI和IOC示例

可能重复:
控制反转<依赖注入

任何人都可以请帮我理解简单的C#示例的DI和IOC吗? 据我所知,IOC是控制流的倒置(这对我来说毫无意义),DI意味着通过属性或构造函数来注入接口。 不知道这两者是如何相关的。

谢谢。


我会添加一个解释,我被告知是有帮助的。

正如你正确指出的那样,依赖注入是一类通过构造函数或setter注入来要求合作者的行为。 你可以把它看作一种编码技术。 另一方面,控制反转更多的是设计技巧 - 一种哲学,如果你愿意的话。

在过程式编程(和面向对象语言的过程式编程)中,你通常有某种“指挥和控制”的哲学。 如果要创建由三个地板对象组成的房屋对象,每个对象由多个房间对象组成,则创建一个房屋对象,其构造函数实例化三个地板对象,每个对象的构造函数反过来实例化房间对象。

当你反转控制时,你正在反转命令和控制范式。 有了IoC,当我去实例化一栋房子时,它并没有考虑到我所有的细节。 相反,它说,通过它的构造函数(和依赖注入),“你不能在没有一些地板的情况下实例化我”。 所以,你去实例化地板,他们说“不,没有一些房间”。 现在,在这种“颠倒”的风格中,我们的房子并不控制房间的创造 - 它将其留给别人,而是表达出来,而仅仅是它会对房间给予的处理方式。 这是可取的,因为通过翻转命令和控制它的头部,你可以有更好的接口来推理和测试代码 - 将事物解构成组件更容易。

因此,总而言之,控制反转是哲学,依赖注入是它实现的手段。


假设你有一个需要服务的类:

public class A 
{
  IEmailSender _emailSender
  public A(IEmailSender emailSender)
  {
    _emailSender = emailSender;
  }

  private void SendEmail()
  { 
    _emailSender.Send();
  }
}

现在称A类对IEMailSender有依赖性,这意味着它需要一个实现IEMailSender的对象才能执行它的功能。

像ninject或autofac这样的依赖注入框架将负责创建一个实现IEMailSender并将其注入到A的构造函数中的对象 ,前提是您告诉他们如何创建这样的对象。

例如使用ninject:

Bind<IEmailSender>().To<EmailSender>();

这是告诉ninject,每当一个类需要一个IEMailSender时,给他们EmailSender(假设EmailSender实现了IEMailSender接口)

这很简单,我希望这可以帮到你。


我强烈建议您阅读.NET中的依赖注入,详细介绍了全面的代码示例。 对于控制的倒置,你应该参考Robert Martin的另一本书:C#中的敏捷原则,模式和实践。 它详细介绍了带有示例和可理解解释的SOLID原则。 这两本书确实帮助我理解了这些原则。

链接地址: http://www.djcxy.com/p/82231.html

上一篇: DI and IOC examples in simple C#

下一篇: Debugging Phalcon as a PHP developer