关于IoC的问题

时间:2011-02-18 17:28:30

标签: c# dependency-injection ioc-container ninject layer

我正在研究类之间的高耦合,特别是IoC。 我想问一些问题:

  1. 我正在使用Ninject;我应该把dll Ninject放在哪一层
  2. 当我创建一个设置发送给客户端时,dll Ninject也会转到客户?
  3. 我一直在研究互联网并得出以下结论: 一个。控制的反转是当我改变我的类并且我不在他们自己的类中实例化它们,而是作为参数传递或使用像Ninject这样的工具 湾依赖注入是指我添加到项目界面而不是具体类。

3 个答案:

答案 0 :(得分:2)

  1. IoC的概念与架构层的概念是正交的。每当您使用Ninject功能(例如[Inject]属性(通常在注入类的级别))或(b)无论您在何处设置内核和模块(通常在客户端级别),都必须引用Ninject(a)

  2. 是。 Ninject将成为运行时的依赖项。

  3. IoC可能会呈现这些行为,但其核心概念可能会被更好地理解为 Holywood principle :不要打电话给我们,我们会打电话给你。这意味着,不要费心设置您的依赖项,因为它们将为您提供。您可以通过多种方式实现这一目标,即使是“手动”,尽管像Ninject这样的工具可以极大地缓解您的生活。无论如何,通过参数接收依赖对象(主要是在对象构造期间)是一种非常常见的模式,因为它通过接口而不是类来定义依赖关系。

  4. 使用接口可以帮助您建立合同,更好地将需求与实现分开(这是首先应用IoC的驱动因素)。此外,它可以帮助您编写测试和模拟。但那是另一种可能性。玩得开心!我已经使用Ninject差不多一年了,我发现它很容易使用和维护。

答案 1 :(得分:1)

Ad2的。您必须在设置中添加ninject dll。

Ad3的。控制反转(IoC)与接口和类无关。您可以使用高度耦合的代码来控制反转。

class GodClass
{
    void DoSth(int param)
    {
        switch (param)
        {
           case 0: Console.WriteLine("param is 0"); break;
           case 1: Console.WriteLine("param is 1"); break;
        }
    }
}

和IoC看起来像:

class GoodClass
{
     Dictionary<int, BaseClass> _consoleWriters;

     public GoodClass( IEnumerable<BaseClass> writers )
     {
         foreach (var writer in writers) 
            _consoleWriters.Add( writer.ParamSupported, writer);
     }
     void DoSth(int param)
     {
         _consoleWriters[ param ].DoSth();
     }
}

abstract class BaseClass
{
    abstract int ParamSupported {get;}
    abstract void DoSth(int param);
}

class ZeroWriter : BaseClass
{
     override int ParamSupported {get{return 0;}}
     override DoSth(int param) { Console.WriteLine("param is 0"); }
}

class OneWriter : BaseClass
{
     override int ParamSupported {get{return 1;}}
     override DoSth(int param) { Console.WriteLine("param is 1"); }
}

的Ad1。我将在Main函数中添加IoC框架配置/初始化,并将对初始化容器的引用传递给其余代码。

答案 2 :(得分:0)

  1. 你应该引用Ninject,你用它来注册&amp;解决你的依赖关系。最明显的地方是你的应用程序shell /入口点。
  2. On Dependency Injection ...根据您所说的语言,这可能不是真的。在C#/ VB.NET案例中,是的。在JavaScript,Ruby等动态语言中并不是真的。我想现在,如果你使用的是DynamicObject,它也可能是错误的。通过指定您的类依赖于接口而不是具体类,您可以手动或通过使用像Ninject这样的IoC容器轻松地注入该接口的不同实现。

    On Inversion of Control ...它基本上是说调用类/方法不是创建它需要做的工作所需的其他组件,而是让它在其他地方创建并将它传递给你的类/方法。打破这个具体的依赖关系链将使您的代码更加松散耦合,并允许您使用实现相同接口/契约的不同组件替换所需组件的一个实现。

    关于依赖倒置原则/ IOC的优秀解释可以在http://www.objectmentor.com/resources/articles/dip.pdf中找到。

    关于这个主题的其他好资源: