【问题标题】:What to pass via constructor and what to pass via interface?通过构造函数传递什么,通过接口传递什么?
【发布时间】:2010-10-28 15:22:52
【问题描述】:

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

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

关于选择一个选项而不是另一个选项有什么规则吗?当您知道接口只会在您正在编码的场景中被调用一次时,这个问题是最困难的。

【问题讨论】:

    标签: dependency-injection


    【解决方案1】:

    我喜欢这样想:

    • 构造函数参数是实现细节
      • 它们适用于所有操作
      • 它们不会因任何操作而改变(不变)
      • 没有它们也能理解界面
      • 它们是反映应用程序接缝的配置值
    • 方法参数是上下文相关的
      • 它们仅限于单个操作
      • 它们是反映应用程序数据流的运行时值

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

    void Insert(User user);
    
    void Insert(User user, IDbConnection dbConnection);
    

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

    意图:创建一个新用户

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

    让我们将任务设置为“我需要创建一个用户”。这为我们提供了一种评估上述两个签名的方法,偏向于符合我们意图的签名:

    void Insert(User user);
    

    分析操作的意图及其数据的适用范围通常会得出可靠的结果。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-16
        • 2020-03-18
        • 2012-03-19
        • 2016-07-19
        • 1970-01-01
        • 2016-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多