什么是IoC子容器以及它们是如何使用的?

时间:2011-03-25 00:16:24

标签: c# .net dependency-injection ioc-container

我听说人们谈论IoC中的儿童容器,当我谷歌时,我回到这里,回答这些让我想知道他们是什么的问题。

什么是IoC子容器以及它们是如何使用的?

2 个答案:

答案 0 :(得分:9)

这个术语没有单一的定义 - 在一个容器中实现为“子容器”的东西在另一个容器中通常具有完全不同的逻辑功能。

在Autofac和一些类似的容器中,“子容器”(因为v2,只是“生命周期范围”)是一种创建一组相关的组件的方法,其寿命比“父”容器短,因此依赖关系只能从子到父解决,而从不相反。

其他容器有不同的实现,有些允许依赖解析双向(至少在我的理解中)。你正在使用的特定容器是一个重要的额外信息,可以更加权威地回答这个问题。

希望这有帮助!

答案 1 :(得分:3)

IoC - 或控制反转 - 是一种让您的类依赖于服务和其他类而不知道如何实现它们并且只知道如何使用它们的方法。请考虑以下示例:

public class MyService
{
    public void DoSomething()
    {
         Logger l = new Logger(); // let's assume this class exists, and it logs stuff
         l.Info("Some info logmessage");
    }
}

在这里我们称之为服务:

public class MyProgram {
    public MyProgram()
    {
        MyService myService = new MyService();
        myService.DoSomething();
    } 
}

现在,通过依赖注入或IoC,我们可以反转日志记录的责任。简而言之,这意味着MyService不应该真正知道如何实例化记录器,但它应该知道如何使用它。

所以假设Logger类实现了一个名为ILog的接口,它只包含方法void Info(string s)

然后我们可以将MyService类重构为:

public class MyService
{
    ILog _logger;
    public MyService(ILog logger)
    {
          _logger = logger;
    }
    public void DoSomething()
    {

         _logger.Info("Some info logmessage");
    }
}

这意味着我们还必须重构MyProgram

public class MyProgram {
    public MyProgram()
    { 
        ILog logger = new Logger(); // instanciate it here instead.
        MyService myService = new MyService(logger);
        myService.DoSomething();
    } 
}

这基本上是Inversion of Control,但是当我们开始谈论依赖注入时,这一切都可以自动完成。比方说我们想要使用Ninject进行注射。我不打算在这里写出代码示例,但基础是Ninject必须设置为知道当某个类请求ILog接口时,我们应该返回Logger类。

这使我们能够轻松更改我们想要用于不同接口的实现类型 - 还提高了可测试性。

我会在tekpub上推荐这个简短的免费视频,向您介绍使用Ninject进行IoC和依赖注入的示例。

http://www.tekpub.com/view/concepts/1

希望这有帮助!