为什么AOP和DI很少一起使用

用户名

我对这条线感到困惑

面向方面的编程和依赖注入是非常不同的概念,但是在少数情况下它们可以很好地结合在一起。

从这个网站

http://www.postsharp.net/blog/post/Aspect-Oriented-Programming-vs-Dependency-Injection

我了解DI优于AOP的优势,但是为什么 他们不是经常在一起使用吗?为什么只有少数情况下它们可以放在一起?是否由于AOP的编译方式而使两者都难以使用?

史蒂文

您如何定义“有限情况”?我自己总是一起使用AOP和DI。

基本上有三种应用AOP的方法,它们是:

  1. 使用诸如PostSharp之类的代码编织工具。
  2. 使用动态拦截工具,例如Castle Dynamic Proxy。
  3. 使用装饰器。

DI与代码编织工具的使用不能很好地混合和匹配,我认为这就是Postsharp网站指出“在有限的情况下它们可以很好地融合在一起”的原因。它不能混合和匹配的一个原因是,依赖注入是关于松散耦合的,而代码编织则在编译时将代码和方面硬耦合在一起。从DI的角度来看,代码编织成为一种反模式。本书的11.2节中马克和我非常清楚地说明了这一论点。总而言之,我们声明:

DI的目的是通过将Seams引入您的应用程序来管理易失性依赖性Theis使您可以在“合成根”内部集中对象图的合成

这与您在应用编译时编织时实现的帽子完全相反:是导致易失性依赖项在编译时耦合到您的代码。这使得无法使用适当的DI技术以及在应用程序的Composition Root中安全地组成完整的对象图出于这个原因,我们说编译时编织与DI相反-在挥发性依赖项上使用编译时编织是一种反模式。[第355页]

但是,如果使用动态拦截,则意味着通过动态生成装饰器在运行时应用横切关注点,它可以与DI一起使用,并且可以轻松地与大多数DI库集成,并且在使用Pure DI时也可以完成,这是我们在11.1节中演示的。

我个人的喜好是使用装饰器。我的系统设计围绕一个少数明确定义通用的抽象,这让我在那是我的系统是重要的,几乎所有的地方应用横切关注点。这使我在极少数情况下会出现一些装饰效果不佳的地方,但这几乎总是由设计缺陷引起的。由于我自己作为开发人员的局限性,或者由于.NET框架或某些其他工具的设计缺陷而引起的。INotifyPropertyChanged接口是一种著名的设计缺陷您可能已经猜到了,但是在我们的书中,我们非常详细地描述了这种方法。我们在这个主题上花了整整一章(10)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

内部类和公共构造函数-为什么它与Activator.CreateInstance一起使用?

来自分类Dev

Finagle和Akka,为什么不一起使用它们?

来自分类Dev

Finagle和Akka,为什么不一起使用它们?

来自分类Dev

为什么此RewriteRule与[R]一起使用而不与[QSA,L]一起使用?

来自分类Dev

在将maplist与lambda和tilde项一起使用时,为什么存在无限循环?

来自分类Dev

为什么MongoDB不再允许将$ set和$ unset与空文档一起使用?

来自分类Dev

为什么选择范围和弹出窗口不能在javascript中一起使用?

来自分类Dev

为什么将余弦相似度和TF-IDF一起使用?

来自分类Dev

为什么MockMVC和Mockito不能一起使用?

来自分类Dev

为什么不能将@PostConstruct和@Retryable一起使用?

来自分类Dev

为什么filter和rowSums不能一起使用?

来自分类Dev

为什么Intl.NumberFormat无法在Safari和Firefox中与单元一起使用?

来自分类Dev

SFINAE和衰变不能一起使用。为什么?

来自分类Dev

为什么使用扩展语法可与基元和函数一起使用?

来自分类Dev

为什么不将向量和列表一起使用?

来自分类Dev

为什么Bootstrap行和列不能与车把一起使用?

来自分类Dev

为什么此RewriteRule与[R]一起使用而不与[QSA,L]一起使用?

来自分类Dev

为什么inline-block和max-width不能一起使用?

来自分类Dev

为什么企业会一起使用Struts 1和Spring

来自分类Dev

为什么bash条件检查与[[-n ..]]一起使用,而不与[-n ..]一起使用?

来自分类Dev

为什么Quickbooks可以与Ubuntu一起使用,而不能与Fedora一起使用?

来自分类Dev

为什么不能将字段与getField()和setField()一起使用?

来自分类Dev

为什么const char *无法与boost的stringstream和read_json一起使用?

来自分类Dev

为什么它可以与$ scope一起使用,但不能与`this`一起使用?

来自分类Dev

什么是位图和位工厂,为什么人们将其与动画一起使用?

来自分类Dev

为什么这个数组和 foreach 不能与 mysqli 一起使用?

来自分类Dev

为什么 HHVM 和 NGINX 一起使用?

来自分类Dev

为什么 xargs 与 echo 一起使用,但不与 sort 一起使用?

来自分类Dev

为什么HMR和chunkhash不能一起使用?

Related 相关文章

  1. 1

    内部类和公共构造函数-为什么它与Activator.CreateInstance一起使用?

  2. 2

    Finagle和Akka,为什么不一起使用它们?

  3. 3

    Finagle和Akka,为什么不一起使用它们?

  4. 4

    为什么此RewriteRule与[R]一起使用而不与[QSA,L]一起使用?

  5. 5

    在将maplist与lambda和tilde项一起使用时,为什么存在无限循环?

  6. 6

    为什么MongoDB不再允许将$ set和$ unset与空文档一起使用?

  7. 7

    为什么选择范围和弹出窗口不能在javascript中一起使用?

  8. 8

    为什么将余弦相似度和TF-IDF一起使用?

  9. 9

    为什么MockMVC和Mockito不能一起使用?

  10. 10

    为什么不能将@PostConstruct和@Retryable一起使用?

  11. 11

    为什么filter和rowSums不能一起使用?

  12. 12

    为什么Intl.NumberFormat无法在Safari和Firefox中与单元一起使用?

  13. 13

    SFINAE和衰变不能一起使用。为什么?

  14. 14

    为什么使用扩展语法可与基元和函数一起使用?

  15. 15

    为什么不将向量和列表一起使用?

  16. 16

    为什么Bootstrap行和列不能与车把一起使用?

  17. 17

    为什么此RewriteRule与[R]一起使用而不与[QSA,L]一起使用?

  18. 18

    为什么inline-block和max-width不能一起使用?

  19. 19

    为什么企业会一起使用Struts 1和Spring

  20. 20

    为什么bash条件检查与[[-n ..]]一起使用,而不与[-n ..]一起使用?

  21. 21

    为什么Quickbooks可以与Ubuntu一起使用,而不能与Fedora一起使用?

  22. 22

    为什么不能将字段与getField()和setField()一起使用?

  23. 23

    为什么const char *无法与boost的stringstream和read_json一起使用?

  24. 24

    为什么它可以与$ scope一起使用,但不能与`this`一起使用?

  25. 25

    什么是位图和位工厂,为什么人们将其与动画一起使用?

  26. 26

    为什么这个数组和 foreach 不能与 mysqli 一起使用?

  27. 27

    为什么 HHVM 和 NGINX 一起使用?

  28. 28

    为什么 xargs 与 echo 一起使用,但不与 sort 一起使用?

  29. 29

    为什么HMR和chunkhash不能一起使用?

热门标签

归档