代码之家  ›  专栏  ›  技术社区  ›  GilliVilla

重载和依赖注入有什么区别?

  •  2
  • GilliVilla  · 技术社区  · 14 年前

    虽然DI是接口驱动的,但我仍然不清楚它与基本重载概念的区别。任何例子都会有帮助。

    编辑: 我在这里读过 the reason for my question 那个 StreamReader

    3 回复  |  直到 7 年前
        1
  •  14
  •   Jon Skeet    14 年前

    它们是完全不同的概念。

    重载:提供具有相同名称(或构造函数)的多个方法,这些方法的参数数量和/或类型不同。

    依赖注入:为组件提供他们需要使用的所有服务(例如身份验证器、数据库连接等),而不是让组件自己构造这些依赖。DI鼓励在接口和实现之间进行干净的分离,并使单元测试更加容易(因为您可以模拟/伪造依赖关系)。

    编辑:我不认为我通常会使用 StreamReader 作为依赖注入的一个很好的例子,尤其是 如果只指定文件名,则为您创建自己的流。可以用一个 Stream 参数有效地允许注入流依赖项,但这不是我通常认为的DI。构造器当然是重载的一个例子,但两者实际上是不相关的。

    通常我会用

        2
  •  5
  •   Greg D    14 年前

    重载是语言的一个特点 其中(例如)两个方法可以共享相同的名称,但具有不同的参数列表。例如:

    public Foo MakeFoo(int bar) { }
    public Foo MakeFoo(double bar) { }
    public Foo MakeFoo(Decimal bar) { }
    

    依赖注入是一种与语言无关的技术 删除对象中生成的隐藏依赖项,并将它们传递到对象中。例如。:

    将此转换为:

    // Foo has an implicit dependency on Bar
    class Foo
    {
        private Bar myBar;
        public Foo()
        {
            this.myBar = new Bar();  
        }
    }
    

    // Now Foo's dependency on Bar is explicit b/c it's being injected in the .ctor
    class Foo
    {
        private Bar myBar;
        public Foo(Bar aBar) 
        {
            this.myBar = aBar;
        }
    }
    
        3
  •  2
  •   James Curran    14 年前

    很难回答这个问题,因为这两个概念真的没有共同点。

    • 依赖注入:方法(或类)使用的对象不是在方法内创建的,而是在方法外创建并传递(注入)到方法中的。

    更新(基于OP的更新):

    StreamReader是DI的一个例子,因为它实际上并没有创建它所读取的数据流——数据流是在其他地方创建的,并传递到它的ctor中。这使得它可以处理任何形式的流(磁盘文件、字符串、网络套接字等)