2010-10-28 100 views
3

这是一个关于依赖注入的问题。在构建服务对象时,我们在构建阶段通过构造函数传入协作者。服务对象将实现一个接口,并在运行阶段调用该接口。通过构造函数传递什么以及通过接口传递什么?

有时候很难知道一个特定的对象应该通过构造函数传递还是成为服务类实现的接口的一部分?

是否有关于选择其他选项的规则?当你知道接口只会在你编码的场景中被调用一次时,这个问题是非常困难的。

回答

5

我喜欢把它像这样:

  • 构造函数参数的实施细则
    • 他们作用域所有操作
    • 他们没有回应更改为任何操作(不变)
    • 无需他们即可理解界面
    • 它们是反映应用程序接缝的配置值
  • 方法参数是上下文
    • 它们限定一个单独运转
    • 它们反映运行时的值的应用程序的数据流

很多现有技术是在取景正确的问题。例如,我们可能会对自己说:“我需要在用户表中创建一个新行。”从这个角度来看,无论是这些签名似乎很动听:

void Insert(User user); 

void Insert(User user, IDbConnection dbConnection); 

但是,我们可以打破我们的任务定义:

意图:创建一个新用户

实现细节:一用户是表中的一行

让我们改为将任务设置为“我需要创建用户”。这给了我们一个方法来评估上述两个签名,这有利于我们的意图相匹配的:一般给人实实在在的成效

操作的意图
void Insert(User user); 

分析其数据的适用范围。

2

经验法则我经常使用的是类是否可以在没有传入值的情况下运行,与构造函数的复杂性保持平衡。如果这个类在没有参数的情况下不能正常运行,通常把它放在构造函数中是很好的。另一方面,如果这个类被设计为做一些需要额外工作的事情,比如通过套接字接受连接,那么这种工作通常应该延迟到稍后的功能。

相关问题