【问题标题】:When implementing dependency injection, should exceptions be injected?在实现依赖注入的时候,应该注入异常吗?
【发布时间】:2010-10-18 20:52:37
【问题描述】:

我的团队正在使用自制的 DI 容器在 PHP 项目中实现依赖注入。我们对 DI 的第一次迭代可能被发挥到了极致,甚至将异常注入到依赖它们的类中。

这是一种好习惯还是矫枉过正?

【问题讨论】:

    标签: oop dependency-injection solid-principles


    【解决方案1】:

    依赖注入的目的是颠倒获取依赖的责任,这些依赖是对象用来促进配置或协作行为的协作者。

    一般来说,例外是给定类的契约所固有的。也就是说,异常是组件在发生故障时如何表现的隐式或显式契约的一部分,因此不适合使用衍生工具来切换。事件通常也没有行为,因此为了测试隔离而抽象它们也不是特别有价值。此外,由于事件通常只表示故障状态或事件,因此能够注入异常的派生也不是特别有价值,因为组件的任何消费者都需要针对基本异常合同进行编码(即任何附加属性都不会可见)。

    也许有一些您可能想要注入异常的正当理由,例如在记录、包装等之后重新抛出异常的异常处理组件的设计,或者可能在哪里异常本身的构造需要外部资源来实现(尽管这种需要本身会让我停下来),但总的来说,我不会说您应该将组件报告其故障状态的方式与组件本身分离。

    【讨论】:

    • 作为一个总是对细节感到好奇的人(无论多么微小),这是一个很好的答案!
    • 另外,在 PHP 中,异常指向创建它们的行,而不是抛出它们的行。所以注入它们会让它们指向 DI 容器中创建异常的行,这可能不是你想要的 :) 来源:php.net/manual/en/class.exception.php
    【解决方案2】:

    这听起来有点矫枉过正。

    当抛出异常时,它应该通过其消息和类型提供某种有用的信息。

    如果您要注入要使用的 Exception 类,这意味着 Exception 的类型不再有助于找出问题的真正原因(因为您在注入它之后就已经知道类型)。

    【讨论】:

    • 那么在单元测试时允许类耦合到它们抛出的异常是可接受的妥协吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多