避免依赖携带

时间:2010-06-01 20:56:07

标签: dependency-injection

编码时,我经常遇到以下模式:

-A方法调用另一个方法(Fine),但被调用的方法/ callee接受参数,所以在wrap方法中,我传入参数。问题是,这种依赖性可以继续下去。我怎么能避免这种情况(赞赏任何示例代码)?

由于

5 个答案:

答案 0 :(得分:3)

仅仅因为较低层组件需要它而传递参数是 Leaky Abstraction 的标志。它通常可以更有效refactor dependencies to aggregate services并隐藏接口背后的每个依赖项。

横切关注(通常是传递参数的最常见原因)是best addressed by Decorators

如果您使用具有拦截功能的DI容器,您可以利用这些功能非常有效地实现装饰器(有些人将此称为容器的 AOP 功能)

答案 1 :(得分:2)

您可以使用依赖注入框架。其中一个是Guice:见http://code.google.com/p/google-guice/

答案 2 :(得分:2)

步骤1:不要将所有内容作为单独的参数传递,而是将参数分组到一个类中,假设是X.

步骤2:将getter添加到类X以获取相关信息。被调用者应该使用getter来获取信息,而不是依赖于参数。

步骤3:创建类X继承的接口类。将所有getter放在接口中(在C ++中,这是纯虚方法)。

步骤4:使被调用的方法仅依赖于接口。

答案 3 :(得分:1)

重构:引入参数对象

你有一组自然结合在一起的参数吗?

用物体替换它们。

http://www.refactoring.com/catalog/introduceParameterObject.html

参数对象的优点是,如果你添加/删除参数,传递它们的调用不需要改变。

(考虑到你的答案背景,我不认为IoC库或依赖注入模式真的是你所追求的)

答案 4 :(得分:0)

由于它们不能(轻松)进行单元测试,因此大多数开发人员选择将对象注入到视图中。由于视图(通常)不用于构建其他视图,因此您的DI链结束。您可能遇到问题(我曾经在ahwile中遇到过),您需要以正确的顺序构建对象,尤其是在使用像Unity这样的DI框架时,其中解决对象的attemt将会死锁。您需要担心的主要问题是循环依赖。为此,请阅读以下文章:

Can dependency injection prevent a circular dependency?