【问题标题】:IoC, AOP and moreIoC、AOP 等
【发布时间】:2009-06-03 17:41:49
【问题描述】:

什么是 IoC 容器?

什么是 IoC/DI 框架?

为什么我们需要 IoC/DI 框架?

IoC/DI 和 AOP 之间有什么关系吗?

关于 IoC 和 AOP,Spring.net/ninject 是什么?

【问题讨论】:

标签: dependency-injection inversion-of-control ninject spring.net


【解决方案1】:

JMSA,

James Kovacs 写了一篇精彩的文章,涵盖了您的许多问题,我建议您阅读它Here

Spring.Net、Ninject、Unity、Castle Windsor、Autofac 都是 IOC 容器,可通过不同方式进行配置,其中许多还支持 AOP。

IOC/DI 框架很有用,因为它们提供了标准机制,例如,如果您正在雇用新开发人员,这更容易说,我们使用此框架并将链接传递给他们到教程/帮助指南。同时,这些框架经过大型社区/公司的试用和测试。

如果您在阅读本文和上述答案后仍有任何问题没有得到解答,请告诉我,我会尽我所能提供进一步的帮助。

【讨论】:

  • 谢谢彼得!真的很有帮助!
  • IoC/DI和AOP有什么关系吗?
  • 在某种程度上存在某种关系。如果您研究 AOP,它主要应用于诸如日志记录和横切关注点的安全权限样式之类的事情。在日志记录的情况下,许多开发人员会将其与 DI / IOC 一起使用,以便他们可以切换日志记录提供程序(例如将 log4net 交换为企业库日志记录)。但真正的答案是你不需要 DI 或 IoC 来实现 AOP,而要实现 DI 或 IoC 你不需要使用 AOP。
  • Microsoft Unity 容器确实使用 aop 和 DI 来指定依赖项。例如,如果您有一个具有服务的 dll 和一个具有数据访问代码的 dll,您可以指定服务 dll 依赖于数据访问 dll,因此指示统一加载数据访问 dll 并在尝试初始化服务 dll 之前对其进行初始化.
  • DI / IoC 的另一种风格是使用服务定位器模式。你可能也想研究这个。 Martin Fowlers 博客有很多关于这个主题的内容。工具包已链接到他的博客下面。
【解决方案2】:

从语义的角度...

依赖注入本身意味着一个依赖,即构造/使用(应用程序的“核心问题”)必需的东西。例如,汽车不是没有引擎的汽车。

方面被描述为与应用程序的核心关注点相交叉。这意味着与核心关注点分开且不重要(您可以将它们视为“不错的选择”)。既然应用程序可以在没有方面的情况下运行,那么它们真的是依赖关系吗?例如,即使没有防盗锁,汽车仍然是汽车。

(当然,这是从理论的角度来看。在现实世界中,像安全这样的问题对于有销路的产品的存在通常与核心自身所关心的一样重要。)

因此,虽然在实践中 DI 可用于实现方面,但我不会将该过程称为真正的 DI。这来自专门使用构造函数注入的人。

【讨论】:

    【解决方案3】:

    Martin Fowler 有一篇很好的文章here 介绍了控制反转和依赖注入的含义。

    Spring.NET 使用 AOP 有详细描述here。我对基于 Java 的 Spring 版本比较熟悉,所以我不能绝对肯定地说 Spring.NET 目前只支持基于代理的 AOP。

    也就是说,要通知的类必须实现一个接口。 Spring 将创建一个动态代理来实现此接口并委托给原始目标实例。

    虽然它确实说明了:

    在未来的版本中,我们将使用继承来实现代理,这将允许您代理没有接口的类,并将消除一些使用基于组合的代理无法解决的剩余原始引用问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-17
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 2017-07-23
      相关资源
      最近更新 更多