通过构造函数传递什么以及通过接口传递什么?

WW.*_*WW. 3 dependency-injection

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

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

有关于选择一个选项而不是另一个选项的规则吗?当你知道接口只在你编码的场景中被调用一次时,这个问题就变得非常困难了.

Bry*_*tts 5

我喜欢这样想:

  • 构造函数参数是实现细节
    • 它们适用于所有操作
    • 它们不会响应任何操作而变化(不变)
    • 没有它们就可以理解界面
    • 它们是反映应用程序接缝的配置值
  • 方法参数是上下文的
    • 它们适用于单独的操作
    • 它们是反映应用程序数据流的运行时值

很多艺术都在正确地解决问题.例如,我们可能会对自己说"我需要在用户表中创建一个新行".从这个角度来看,这些签名中的任何一个似乎都很好:

void Insert(User user);

void Insert(User user, IDbConnection dbConnection);
Run Code Online (Sandbox Code Playgroud)

但是,我们可以分解我们的任务定义:

意图:创建一个新用户

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

让我们将任务框架为"我需要创建用户".这为我们提供了一种评估上述两个签名的方法,有利于符合我们意图的签名:

void Insert(User user);
Run Code Online (Sandbox Code Playgroud)

分析操作的意图和其数据的适用范围通常会给出可靠的结果.