【问题标题】:Questions about IoC关于国际奥委会的问题
【发布时间】:2011-02-18 17:28:30
【问题描述】:

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

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

【问题讨论】:

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


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

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

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

    使用接口可以帮助您建立契约,更好地将需求与实现分开(这是首先应用 IoC 的驱动原因)。此外,它还可以帮助您编写测试和模拟。但那是另一个可能性的宇宙。玩得开心!我已经使用 Ninject 快一年了,我发现它非常易于使用和维护。

    【讨论】:

      【解决方案2】:

      广告 2。您必须将 ninject dll 添加到您的设置中。

      广告 3。控制反转(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"); }
      }
      

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

      【讨论】:

        【解决方案3】:
        1. 您应该有一个对 Ninject 的引用,无论您使用它来注册和解决您的依赖关系。最明显的地方是您的应用程序外壳/入口点。
        2. 是的
        3. 关于依赖注入...根据您所谈论的语言,这可能不是真的。在 C# / VB.NET 的情况下,是的。在 JavaScript、Ruby 等动态语言中并非如此。我想现在,如果您使用的是 DynamicObject,那么使用 C# 也可能是错误的。通过指定您的类依赖于接口而不是具体类,您可以轻松地手动或使用 IoC 容器(如 Ninject)注入该接口的不同实现。

          关于控制反转...基本上是说,与其让调用类/方法创建它需要完成其工作的其他组件,不如让它在其他地方创建并将其传递给您的类/方法。打破这个具体的依赖链将使您的代码更加松散耦合,并允许您将所需组件的一个实现替换为实现相同接口/合约的不同组件。

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

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

        【讨论】:

          猜你喜欢
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多