当前位置: 首页 > 知识库问答 >
问题:

依赖注入容器的意义是什么?[副本]

杨凌
2023-03-14

使用。NET核心,您可以注册“服务”,据我所知,这仅仅意味着您可以将类型注册到具体的类中。

因此,我决定是时候学习和练习DI了。我理解这个概念,通过测试它是非常有益的。然而,让我困惑的是注册服务的想法以及它是否真的需要。

public class MyClass
{
    public MyClass(IDataContext)
    {
         ... store it 
    }
}
DataContext dc = new DataContext(); // concrete
var c = new MyClass(dc);

编辑

这个问题围绕着如何使用容器(服务)而不是为什么在构造函数中使用接口。

共有1个答案

施赞
2023-03-14

现在,将此代码放入的那些类

public class MyService
{
    public void DoSomething()
    {
        DataContext dc = new DataContext(); // concrete
        var c = new MyClass(dc);
        c.DoSomething();
    }
}

DataContextMyClass有硬依赖关系。因此不能单独测试MyService。类不应该关心其他类如何做它们所做的事情,它们应该只关心它们做了它们说要做的事情。这就是我们使用接口的原因。这是关注点的分离。一旦实现了这一点,就可以独立地对任何代码进行单元测试,而不依赖于外部代码的行为。

预先在一个位置注册依赖项也更干净,这意味着您可以通过更改一个位置来交换依赖项,而不是查找所有的用法并单独更改它们。

public class MyService
{
    private readonly IMyClass _myClass;

    public MyService(IMyClass myClass)
    {
        _myClass = myClass;
    }

    public void DoSomething()
    {
        _myClass.DoSomething();
    }
}

public interface IMyClass
{
    void DoSomething();
}

public class MyClass : IMyClass
{
    private readonly IDataContext _context;

    public MyClass(IDataContext context)
    {
        _context = context;
    }
    public void DoSomething()
    {
        _context.SaveSomeData();
    }
}

要了解更多信息,我建议您观看Miguel Castro的《深入研究依赖注入和编写解耦质量代码和可测试软件》。他提出的最好的观点是,如果您必须使用new来创建对象的实例,那么您已经紧密耦合了一些东西。避免使用new,依赖项注入是一种使您能够避免这种情况的模式。(使用new并不总是坏事,我对POCO模型使用new很满意)。

 类似资料:
  • 问题内容: 我了解依赖注入本身的好处。让我们以Spring为例。我还了解其他Spring功能(如AOP,不同类型的助手等)的好处。我只是想知道XML配置的好处是什么,例如: 与普通的旧Java代码相比,例如: 它更容易调试,检查编译时间,并且仅懂Java的任何人都可以理解。那么,依赖注入框架的主要目的是什么?(或一段显示其优点的代码。) 如果 如果有多个,IoC框架如何猜测要注入的myServic

  • 问题内容: 已经发布了几个问题,其中包括有关依赖项注入的特定问题,例如何时使用它以及支持它的框架。然而, 什么是依赖项注入?何时/为什么/不应该使用它? 问题答案: 依赖注入 将依赖传递给其他 对象 或 框架 (依赖注入器)。 依赖注入使测试更加容易。注入可以通过 构造函数 完成。 其构造函数如下: 问题 :如果涉及复杂的任务,例如磁盘访问或网络访问,则 很难 对其进行单元测试。程序员必须进行模拟

  • 考虑下面的代码: 上面的代码是一个表示一个汉堡包类。 该类假设汉堡包括Bun, Patty 和 Toppings。 该类还负责制作Bun, Patty 和 Toppings。 这是一件坏事。 如果需要素食汉堡怎么办? 一个天真的方法可能是: 好吧,这有点不同,它在某些方面更灵活,但它仍然相当脆弱。 如果Patty构造函数改变以允许新的功能会发生什么? 整个汉堡包类必须更新。 事实上,任何时候任何这

  • 容器和依赖注入 5.1版本正式引入了容器的概念,用来更方便的管理类依赖及运行依赖注入。 5.0版本已经支持依赖注入的,依赖注入和容器没有必然关系 容器类的工作由think\Container类完成,但大多数情况我们只需要通过app助手函数即可完成大部分操作。 依赖注入其实本质上是指对类的依赖通过构造器完成自动注入,例如在控制器架构方法和操作方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于

  • 问题内容: 对于Java,依赖注入作为纯OOP工作,即,您提供要实现的接口,并且在框架代码中接受实现已定义接口的类的实例。 现在,对于Python,您可以以相同的方式进行操作,但是对于Python,我认为该方法的开销太大。那么,您将如何以Pythonic的方式实现它呢? 用例 说这是框架代码: 基本方法 最幼稚(也许是最好的?)方法是要求将外部函数提供给构造函数,然后从该方法中调用它。 框架代码:

  • 问题内容: 我想知道 _什么是Spring Framework? 为什么和何时应该在Java Enterprise开发中使用它? _ 答案将是“依赖注入框架”。好了,使用依赖注入框架时我们有什么优势?用setter值和/或构造函数参数描述类的想法对我来说似乎很奇怪。为什么这样 因为我们可以更改属性而无需重新编译项目?这就是我们所获得的一切吗? 那么,我们应该用什么对象来描述?所有对象还是只有几个?