Dependency injection 依赖注入框架为您做了什么?

Dependency injection 依赖注入框架为您做了什么?,dependency-injection,frameworks,Dependency Injection,Frameworks,我理解的基本概念。与其拥有大量的全局状态,不如将需要的内容传递给各种对象的构造函数 但我不明白这个概念如何应用于框架?依赖项注入框架对您有什么作用?什么时候应该使用依赖项注入框架?我使用它的主要目的是,它允许我插入对象的新实现,而无需重新编译。我只需更改一个配置文件,我的对象就可以正确地连接在一起。该框架基于某种配置(无论是代码、XML文件等)为您连接所有内容 基本上是管道 许多DI框架还包括面向方面编程、对象生命周期管理等,但DI的基础是让您的应用程序启动并运行,对象之间相互通信 另一种说法是

我理解的基本概念。与其拥有大量的全局状态,不如将需要的内容传递给各种对象的构造函数


但我不明白这个概念如何应用于框架?依赖项注入框架对您有什么作用?什么时候应该使用依赖项注入框架?

我使用它的主要目的是,它允许我插入对象的新实现,而无需重新编译。我只需更改一个配置文件,我的对象就可以正确地连接在一起。

该框架基于某种配置(无论是代码、XML文件等)为您连接所有内容

基本上是管道

许多DI框架还包括面向方面编程、对象生命周期管理等,但DI的基础是让您的应用程序启动并运行,对象之间相互通信


另一种说法是:DI框架是一段代码,它调用构造函数并告诉整个过程在完成时运行:)

了解它们的用处的最好方法是尝试一些。我一直想尝试一下,它看起来是一个很好的实现。

我非常喜欢AOP的一点是,在开发和生产版本之间切换非常容易。您可以创建非常详细的日志记录,然后基本上翻转xml开关,它就消失了。

使用DI/IOC的主要优点之一是减少不同类之间的耦合

当您使用这种方法时,您必须配置对象的层次结构,它表示您从其代码中提取的依赖项。这可以转化为大量代码。即使您使用DI框架的代码部分,也可以通过让您以更具表现力的方式进行配置,从而大大减少配置量:

  • 每当需要ILogger时,请使用 文件记录器
  • 你可以更进一步 约定,无论何时 已请求I[名称]控制器
    将其替换为[Name]控制器
  • 您可以让它管理单例 为您准备的对象。所以你的代码是 与任何其他方法相同
    依赖关系,但DI确保 您始终得到相同的实例 时间
我使用的两种structuremap配置:

    ForRequestedType<ILogger>().TheDefaultIsConcreteType<NLogLogger>();
    //the following injects any property that has a type 
    //that implements IController. (overcomes a regular asp.net limitation with DI)
    SetAllProperties(
         p => p.TypeMatches(t => t.IsConcreteAndAssignableTo(typeof(IController)))
    );
ForRequestedType()。默认类型();
//下面将注入具有类型的任何属性
//它实现了IController。(使用DI克服了常规asp.net的限制)
SetAllProperties(
p=>p.TypeMatches(t=>t.IsConcreteAndAssignableTo(typeof(IController)))
);

@Jon Skeet,但我为什么不亲自给那些构造函数打电话呢?我想我不明白间接的好处。如果我用一些简单的类创建一个程序,并创建它们传递其他对象的实例,DI如何使这比我自己通常做的更容易呢?代码并不总是表达这一点的最简单方式——即使您使用代码(例如,使用GUI),您通常也可以只表达一次:“当我需要验证器时,无论它在哪里,请使用。”